求组合算法

sunboyqq23 2010-07-23 07:10:19
有5个数组,每个数组长度不同,数组元素全部按从小到大有序
要求从每个数组中选出一个元素,加到一起,和小于某个固定的值,求找出所有满足这样条件的组合
尽量高效
...全文
62 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Six_dimensional 2010-07-24
  • 打赏
  • 举报
回复
今儿出去玩了,回来就给你编了程序如下

#include <stdio.h>
#define Limit 43


int lent[5]={20,15,8,7,5};
int current;
int count;

void Slove(int Num,int *arr)
{
int i;
int *p=arr;
if(Num==0)
{
for (i=lent[Num]-1;i>=0;i--)
{
if(current+p[i]<=Limit)
{
count+=i+1;
return ;
}
}
return ;
}
else
{
for (i=lent[Num]-1;i>=0;i--)
{
if(Num==4)
current=0;
current+=p[i];
if(current<Limit)
Slove(Num-1,p+lent[Num]);
current-=p[i];
}
}
}

int main()
{
int arr1[20]={5,9,36,39,42,49,57,59,61,65,67,69,72,75,76,78,81,83,85,89};
int arr2[15]={12,15,19,24,29,34,36,39,42,49,52,57,59,61,65};
int arr3[8]={23,24,41,50,55,57,60,65};
int arr4[7]={1,5,9,36,39,42,49};
int arr5[5]={1,5,9,31,54};
Slove(4,arr5);
printf("%d", count);
return 0;
}
sunboyqq23 2010-07-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qiyu1988 的回复:]
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#define M 50

int main()
{
int arr1[10]={1,2,6,14,35,45,46,89,100,101};
int arr2[5]={0,3,8,9,11};
int arr3[8]={1,3,4,10,11,1……
[/Quote]
还能再优化吗,我有五个数组的话就需要5个嵌套的循环了,效率太低了吧
qiyu1988 2010-07-23
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>
#define M 50

int main()
{
int arr1[10]={1,2,6,14,35,45,46,89,100,101};
int arr2[5]={0,3,8,9,11};
int arr3[8]={1,3,4,10,11,13,22,40};

int i,j,k;

for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<8;k++)
{
if(arr1[i]+arr2[j]+arr3[k]>M)
break;
else
printf("%d %d %d\n",arr1[i],arr2[j],arr3[k]);


}
if(arr1[i]+arr2[j]+arr3[0]>M)
break;
}
if(arr1[i]+arr2[0]+arr3[0]>M)
break;
}
return 0;
}
qiyu1988 2010-07-23
  • 打赏
  • 举报
回复
以前写的

#include<stdio.h>
#include<stdlib.h>
#define M 50

int main()
{
int arr1[10]={1,2,6,14,35,45,46,89,100,101};
int arr2[5]={0,3,8,9,11};
int arr3[8]={1,3,4,10,11,13,22,40};

int i,j,k;

for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<8;k++)
{
if(arr1[i]+arr2[j]+arr3[k]>M)
break;
else
printf("%d %d %d\n",arr1[i],arr2[j],arr3[k]);


}
if(arr1[i]+arr2[j]+arr3[0]>M)
break;
}
if(arr1[i]+arr2[0]+arr3[0]>M)
break;
}
return 0;
}
Six_dimensional 2010-07-23
  • 打赏
  • 举报
回复
明儿给你编
chj_2003 2010-07-23
  • 打赏
  • 举报
回复
大致思路是求一个满足条件的最大边界。(这个边界不唯一)
五个数组,按照优先级取满足条件最大值,比如:满足条件的情况下,先在第一个数组中选择尽可能大的数,然后第一个数固定,再在第二个中选择最大,直到第五个数组也选择。这样选出任何的数,被与它同数组中任意小于它的数替换依然满足条件,也就不必进行计算了。然后变换数组间的优先级,再重复上述步骤。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧