洛谷 P1049 装箱问题

  这个题用贪心做肯定不行的,因为贪心得到的只是局部最优解,而这个题需要的是全局最优解,所以就用到了动态规划。

  用动态规划一定要找到这个题的状态转移方程。每一个物体,都只会有两种情况:装入箱子 和 不装入箱子,所以,定义两个数组,第一个数组s[]用来存储当容量为某某时,能装的最大体积,第二个数组a[]用来存储每个物品的体积;

  所以,状态转移方程:s[j]=max(s[j],s[j-a[i]]+a[i]);

  也就是说容量为 j 时,选第 i 个物品和不选第 i 个物品的最大值。

 1 #include<iostream>
 2 using namespace std;
 3 long long v,n,a[35],s[20010],w;
 4 int main()
 5 {
 6     
 7     cin>>v>>n;
 8     for(int i=1;i<=n;++i)
 9     {
10         cin>>a[i];
11     }
12     for(int i=1;i<=n;++i)
13     {
14         for(int j=v;j>=a[i];--j)
15         {
16             s[j]=max(s[j],s[j-a[i]]+a[i]);
17         }
18     }
19     w=v-s[v];
20     cout<<w;
21     return 0;
22 }

  两层循环,第二层循环的 j 一定要大于等于 a[i] 因为若小于 a[i] 的话,这件物品就取不了。

  最后,题目求的是箱子的剩余空间,所以要用总空间再减去所用的空间。

posted @ 2020-04-25 10:41  zkw666  阅读(162)  评论(0编辑  收藏  举报