m个数里面取n个数的算法 (财富悬赏给得不多,但这是我所有了,跪求大牛帮帮忙)

这个算法网上找来的,好像有错呀组合算法本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。首先初始化,将数组前n个元素... 这个算法网上找来的,好像有错呀
组合算法
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。

例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5

假如在6个数中找3个,6个数是1,8,4,3,5,2.按照他的算法没找到1,4,5的组合呀。
这是我做的程序
#include<stdio.h>
#define maxsize 128
int array[maxsize]={0};
int sum=0;
int T,N,M;
int w[maxsize];

void packet(int n,int m)
{
int i,j,k,state;
int count=m-1,count1=m;
for(i=0;i<m;i++)
array[i]=1;
for(i=0;i<m;i++)
sum+=w[i];
if(sum==T)
{
for(j=0;j<m;j++)
printf("%d ",w[i]);
putchar('\n');
}
sum=0;
while(count1!=0)
{
i=M;
state=i;
while(i<N)
{
array[i]=1;
array[i-1]=0;
for(j=0;j<n;j++)
{
if(array[j]==1)
sum+=w[j];
}
if(sum==T)
{
for(j=0;j<n;j++)
{
if(array[j]==1)
printf("%d ",w[j]);
}
putchar('\n');
}
sum=0;
if(count>0)
{
i--;
count--;
}
else
{
i=i+m;
count=M-1;
}
}
count1--;
if(count1==0)
break;
N--;
for(k=0;k<N;k++)
array[k]=0;
M--;
for(k=0;k<M;k++)
array[k]=1;
}
}

void main()
{
int i,n;
printf("Please input package volume:\n");
scanf("%d",&T);
printf("Please input the quantity of the product:\n");
scanf("%d",&n);
printf("Please please input the volume of each product:\n");
for(i=0;i<n;i++)
{
scanf("%d",&w[i]);
}
N=n;
for(i=1;i<=n;i++)
{
M=i;
packet(n,i);
}
}
展开
 我来答
延熠PN
2011-05-20
知道答主
回答量:14
采纳率:0%
帮助的人:0
展开全部
输入n,m。然后输入n个数(不同的,相同的算法有点改变)求n个数中选m个的组合数!采取的是递归的方法!
#include <iostream>
using namespace std;
#define maxn 11
int n,m; //n,中选m个的组合数
int rcd[maxn];
int num[maxn];
void init1()
{
int i,j,val;
for (i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
}
void perm(int l,int p)
{
int i;
if(l==m)
{
for(i=0;i<l;i++)
{
printf("%d",rcd[i]);
if(i<l-1)
printf(" ");
}
printf("\n");
}
for(i=p;i<n;i++)
{
rcd[l]=num[i]; //在l的位置放上该数
perm(l+1,i+1);

}
}//perm

int main()
{
scanf("%d",&n);
scanf("%d",&m);
init1();
perm(0,0);
}
更多追问追答
追问
非常非常感谢你,其实我是在做个课程设计(简单背包问题),我想求出所有组合(即是不规定几个数为一组),再看哪个组合刚好等于背包体积T就输出那个组合的。我很希望你教下我怎么改才能求所有组合。
现在我做好,只是我还看不懂这个算法而已。不管怎样,这个分还是给你的了。
追答
背包问题的话,有背包问题的解法! 如果物品很多的话,你要求的他所有组合就很难实现了!当n超过30时,递归的时间就很长了,就无法实现了!
希望你能给你的问题的具体内容,给我看看!
7758851314525
2011-05-21
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
SB
追问
你可以说我2B,但我不喜欢别人叫我SB。fuck you!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仙幼萱67
2011-05-21
知道答主
回答量:4
采纳率:0%
帮助的人:0
展开全部
m,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式