这个题用贪心做肯定不行的,因为贪心得到的只是局部最优解,而这个题需要的是全局最优解,所以就用到了动态规划。
用动态规划一定要找到这个题的状态转移方程。每一个物体,都只会有两种情况:装入箱子 和 不装入箱子,所以,定义两个数组,第一个数组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] 的话,这件物品就取不了。
最后,题目求的是箱子的剩余空间,所以要用总空间再减去所用的空间。