01背包问题
状态定义dp[i][v]为前i个物品中,体积恰好为v时的最大价值。
result=max(dp[0][0~V])即为最终答案,他表示前n个物品的最大价值,假设这时的容量为k,由于0<=k<=V,因此容量要在0-V求最大值来寻找k。
状态转移方程:
dp[i][v]=max(dp[i-1][v],dp[i-1][v-c[i]]+w[i])
以上得到的状态i和状态i-1关系是从实际意义推断出来的。
如果不选第i个物品,那么前i个背包的最大价值就是前i-1个物品的价值,即dp[i][v]=dp[i-1][v]
如果选择了第i个物品,那么前i-1个物品的体积就是v-c[i],状态定义为dp[i-1][v-c[i]],注意这时的价值是前i-1个物品的价值,因此少了w[i]的价值,所有dp[i][v]=dp[i-1][v-c[i]]+w[i]
完全背包问题
约束条件:每种物品的数量为无限个,你可以选择任意数量的物品。
状态转移方程:
dp[i][v]=max(dp[i-1][v-k
∗
*
∗c[i]]+k
∗
*
∗w[i]),0<=k
∗
*
∗c[i]<=v
背包问题
最新推荐文章于 2024-10-01 18:52:56 发布