在我们学习动态规划之前,拿到这道题,大部分人首先的思路是贪心,即每次选择体积最大的装入箱中。
但是,贪心存在这样一个问题:局部最优解不一定是全局最优解。例如:
箱子体积为4,物品有3件,体积分别为3,2,2
如果我们每一次选择体积最大的,只能选择体积为3的那一件,这样最后剩余体积为1。然而正确答案却是选择两件体积为2的,剩余体积为0。
因此,我们来看一看如何用动态规划解决此题:
因为每个物体,都有装与不装两种选择,所以我们得到状态转移方程:
f[j]=max(f[j],f[j-w[i]]+w[i]);
f[j] 为:当总容量为 j 时,不放第 i 件物品,所能装的最大体积。
f[j-w[i]]+w[i] 为:当总容量为 j 时,放了第 i 件物品后,所能装的最大体积。(即 j减去第 i 件物品体积 的容量能装的最大体积+第 i 件物品的体积。w[i] 为第 i 件物品体积)
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int f[20005],w[35];
int main()
{
int v,n;
cin>>v>>n;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=n;i++)
for(int j=v;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+w[i]);
cout<<v-f[v];
return 0;
}