题目链接: 装箱问题
1. 动态规划(0、1背包问题)
2. 定义状态表示:dp[i][j] 表示在 1 - i 个物品中,选出不超过容量为 j 的物品的最大体积是多少。
3. 状态转移方程:
1)不选第 i 个物品:dp[i][j] = dp[i - 1][j]
2)选第 i 个物品,如果要选择第 i 个物品,首先判断当前的容量 j 是否能装得下体积为 num[i] 的物品,如果可以就要先选择出在 i - 1 个物品中,选出容量不超过 j - num[i] 的物品的最大体积,因为要留出足够容纳 i 号物品的容量:dp[i][j] = dp[i - 1][j - num[i]] + num[i]
3)dp[i][j] = max(选,不选)的最大值
4. 那么 dp[num.size()][V] 中就存着能选出的最大体积,用容量 V - 最大体积就等于箱子的最小剩余空间
5. 题解代码从下标为 1 开始遍历,故访问 num 数组时需要下标 -1
题解代码:
class Solution
{
public:
int boxin(int V, vector<int>& num)
{
int dp[31][20001] = {0};
for(int i = 1; i <= num.size(); ++i)
{
for(int j = 1; j <= V; ++j)
{
//该位置不选
dp[i][j] = dp[i - 1][j];
//该位置选(需要判断剩于容量是否足够)
if(j >= num[i - 1])
{
dp[i][j] = max(dp[i][j], dp[i - 1][j - num[i - 1]] + num[i - 1]);
}
}
}
return V - dp[num.size()][V];
}
};