一.当3个物品数量,总背包为40时 每个物品重量 10 20 30 价值为 70 80 150
代码如下:
#include<stdio.h>
#define n 3
possible_solution(int x[n]){
int i;
for(i=0;i<3;i++)
if(x[i]!=1) { x[i]=1;return;}
else x[i]=0;
return;
}
int main(){
int w[n]={10,20,30},v[n]={70,80,150};
int x[n]={0,0,0},y[n]={0,0,0};
int tw,tv,tv1=0,limit=40;
int j;
for(j=1;j<=8;j++){
possible_solution(x);
tw=x[0]*w[0]+x[1]*w[1]+x[2]*w[2];
tv=x[0]*v[0]+x[1]*v[1]+x[2]*v[2];
if(tw<=limit&&tv>tv1){
tv1=tv; y[0]=x[0];y[1]=x[1];y[2]=x[2];
}
}
printf("0-1背包问题的最优解 y=(%d,%d,%d)\n",y[0],y[1],y[2]);
printf("总价值为:%d",tv1);
}
通过此代码过程,可以给出通用的枚举法解决所有背包问题
代码如下:
#include<stdio.h>
#include<math.h>
int n;
int fun(int x[n]){
int i;
for(i=0;i<n;i++)
if(x[i]!=1) {x[i]=1; return;}
else x[i]=0;
return;
}
int main(){
int w[100],v[100];
int x[100]={0},y[100]={0};
int tv=0,tv1=0,tw=0,i,j,limit;
printf("请输入多少数量:");
scanf("%d",&n);
printf("请输入背包的容量:");
scanf("%d",&limit);
printf("输入每个产品的重量:");
for(i=0;i<n;i++)
scanf("%d",&w[i]);
printf("输入每个产品的价值:");
for(i=0;i<n;i++)
scanf("%d",&v[i]);
for(j=1;j<=pow(2,n);j++){
fun(x);
for(i=0;i<n;i++){
tw+=w[i]*x[i];
tv+=v[i]*x[i];
}
if(tw<=limit&&tv>tv1){
tv1=tv;
for(i=0;i<n;i++){
y[i]=x[i];
}
}
tw=0;
tv=0;
}
printf("0-1背包问题的最优解为:");
for(i=0;i<n;i++) printf("%d ",y[i]);
printf("\n总价值为:%d",tv1);
}
神来之笔:
int fun(int x[n]){
int i;
for(i=0;i<n;i++)
if(x[i]!=1) {x[i]=1; return;}
else x[i]=0;
return;
}
这个代码可以直接取每个商品的数量是0还是1,要是我写的话,可能用几个for循环遍历0和1吧。