[灌水][偶不是高手也来灌灌水]
怎么论坛突然间多了这个。而且版主还是神vlinux飘飘。看来神的动作还是最快的。希望以后这里经常有高手。。。。让偶学多点东西~~~~~~~
背包问题穷举法
背包问题:有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的重量不超过指定的限制重量,但选中的物品价值最打。
#include<stdio.h>
#include<math.h>
void comb(int s[],int i)/*求每一次取的物品.s[]是做标记的*/
{ int j=0;
while(i>0)
{ s[j++]=i%2;
i=i/2;
}
}
main()
{ int v[]={10,12,13,15,7,9};/*v为物品价钱*/
int w[]={15,8,12,10,5,6};/*w为物品重量*/
int sign[10],tw,maxv=0,i,j,k,temp_w,temp_v;/*sign[]存放每一次的方案
tw是你输入的重量.temp_w是累加重量的
temp_v是累加价值的*/
int biao[10];/*存放最大值时候的标记*/
printf("请输入背包的最大容量:\n");
scanf("%d",&tw);
for(i=0;i<pow(2,6);i++) /*一共有pow(2,n)种,比如你有2个物品的时候.
就有00 01 10 11 4种情况.1就是表示取的物品*/
{ comb(sign,i);
temp_w=0;
temp_v=0;
for(j=0;j<10;j++)
if(sign[j]==1) /*你所取的方案.1的就是表示取*/
{ temp_w=temp_w+w[j];
temp_v=temp_v+v[j];
}
if(temp_w<=tw&&temp_v>maxv)/*当这种方案的总重量不大于你限制的重量.
和大于每一次求出来的最大值*/
{
maxv=temp_v;
for(k=0;k<10;k++)
biao[k]=sign[k]; /*将最大值方案用数组biao[]来存放*/
}
}
printf("你取的方案是:\n");/*以下为输出*/
for(k=0;k<10;k++)
{
if(biao[k]==1)
printf("%d\t",w[k]);
}
printf("\n");
for(k=0;k<10;k++)
{
if(biao[k]==1)
printf("%d\t",v[k]);
}
printf("背包取的最大值是:%d\n",maxv);
}
对这个算法有兴趣而有看的不太明白的就加我QQ吧。
QQ:59071323
POPO:luodongming
E-mail: ldm03@
[此贴子已经被作者于2005-8-12 18:55:03编辑过]