/* 第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 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=1;i<=n;i++){ printf("%d ",chose[i]); } return 0; }为什么chose[2]是1
时间: 2024-03-12 16:48:17 浏览: 76
已知有n中物品和一个可容纳M质量的背包,每种物品i的质量为Wi,假定将物品i放入背包,可以得到Pi的效益,求使背包中物品总效益最大的背包方案。
5星 · 资源好评率100%
在您提供的代码中,选择一个物品的条件是:
```c++
if(choose>=not_choose){
chose[i]=0;
return choose;
}
else{
chose[i]=1;
return not_choose;
}
```
其中,如果选择第 $i$ 件物品,就将 `chose[i]` 赋值为1,否则赋值为0。
因为在递归调用 `fb` 函数时,物品的编号 $i$ 是递减的,所以最后得到的 `chose` 数组是倒序的。在您提供的数据中,第二件物品的重量为3,价值为2,如果将其放入背包,则剩余容量为3,还可以放入第三件物品。
因此,在第二次调用 `fb` 函数时,有:
```c++
choose = fb(1, 3, w, p) = 0
not_choose = fb(1, 0, w, p) + p[2] = 0 + 2 = 2
```
因为 `not_choose` 大于 `choose`,所以第二件物品被选择,即 `chose[2]` 被赋值为1。
所以,`chose` 数组中的第二个元素是1。
阅读全文