[原创][背包问题穷举法]
背包问题:比如说现在有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@