/* 第1行是M和n,表示背包容量为M且有n件物品; 第2行是这n件物品的重量w 第3行是各物品的价值p ,背包容量和物品重量都为整数。 */ #include<stdio.h> #include<string.h> int chose[9000]; int max(int a,int b){ if(a>=b) return a; else return b; } int price=0; int weight=0; int fb(int i,int x,int w[],int p[]){ if(i==0) return 0; if(x-w[i]<0) return fb(i-1,x,w,p); int choose=fb(i-1,x,w,p); int not_choose=fb(i-1,x-w[i],w,p)+p[i]; if(choose>=not_choose){ chose[i]=0; return choose; } else{ chose[i]=1; return not_choose; } } int main(){ //input int M,n; scanf("%d %d ",&M,&n); int f[n+1][M+1]={0}; int w[M+1]; int p[M+1]; for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=n;i++)printf("%d ",chose[i]); }为什么6 3 2 3 4 1 2 5chose数组里面全是0.
时间: 2024-03-12 15:48:13 浏览: 59
已知有n中物品和一个可容纳M质量的背包,每种物品i的质量为Wi,假定将物品i放入背包,可以得到Pi的效益,求使背包中物品总效益最大的背包方案。
5星 · 资源好评率100%
在您提供的代码中,虽然您已经调用了函数 `fb` 来计算背包问题的最优解,但是您并没有将最优解记录下来,而是直接输出了 `chose` 数组。因此,`chose` 数组的值一直为初始值0。
要解决这个问题,您需要在调用函数 `fb` 后,将最优解记录下来,然后再输出 `chose` 数组。可以将最优解保存在变量 `ans` 中,然后根据 `chose` 数组的定义,倒序输出选取的物品,代码如下:
```c++
int main(){
//input
int M,n;
scanf("%d %d",&M,&n);
int w[n+1];
int p[n+1];
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
int ans=fb(n,M,w,p);
printf("%d\n",ans);
for(int i=n;i>=1;i--){
if(chose[i]==1){
printf("%d ",i);
}
}
return 0;
}
```
这样,就可以正确输出背包问题的最优解和选取的物品了。
阅读全文