一.當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吧。