背包问题是已知一个背包的容量,一堆物体的重量和价格,问你怎么装东西价值会达到最大。
用动态规划求解需用到二维数组sum[i][j],表示允许放前i个物体且背包重量为j时的最大价格。此时如果从前往后遍历需要用到二维数组,但每一次求下一个i对应的sum只需要知道前一个i就行了,如果从后往前扫则只需用到一维数组,因为被覆盖掉的部分不会再被使用,代码如下:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 int sum_values[1005]; 5 int main() 6 { 7 int T; 8 int N,V; 9 int i,j; 10 while(scanf("%d %d",&N,&V)&&(N+V)) 11 { 12 int weight[1001],value[1001]; 13 for (i=1;i<=N;i++) 14 { 15 scanf("%d",&weight[i]); 16 scanf("%d",&value[i]); 17 } 18 memset(sum_values,0,sizeof(sum_values)); 19 for (i=1;i<=N;i++)//从第一种水果开始一直到第N种水果 20 for(j=V;j>=weight[i];j--)//从满的状态开始,且第j个状态容量应该要大于第i个种类的大小 21 if (sum_values[j-weight[i]]+value[i]>sum_values[j])//如果第j个状态之前即第j-1个状态放入一个第i类的水果,并且放入后总价值大于第j个状态的价值,则第j-1个状态时选择放入 22 sum_values[j] = sum_values[j-weight[i]]+value[i]; 23 printf("%d\n",sum_values[V]); 24 } 25 return 0; 26 } 27 /* 0 1 2 3 4 5 6 7 8 28 0 0 0 0 0 0 0 0 0 29 0 0 0 0 0 10 10 10 10 30 0 0 0 20 20 20 20 20 30 31 0 0 0 20 20 20 20 25 30 32 0 0 0 30 30 50 50 50 50 33 编号 重量 价值 34 1 5 10 35 2 3 20 36 3 4 5 37 4 2 30*/