一维数组解背包问题

  背包问题是已知一个背包的容量,一堆物体的重量和价格,问你怎么装东西价值会达到最大。

  用动态规划求解需用到二维数组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*/

 

posted @ 2016-04-05 09:41  Jason杰  阅读(338)  评论(0编辑  收藏  举报