每当有人看到这样的题目:数组
有n 种物品(各有一件/都有无限件/有有限件),它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具备最大的价值总和?spa
那我的可能会喊道:code
个人妈呀。。。又是背包【哭】blog
今天我必定要搞懂背包!input
这我的,是你,也(就)是我。(dalao们好!)io
这是最基础的背包问题class
咱们不妨从输入讲起基础
能够用结构体structobject
struct str{ int w; int v; } object[n];
也能够用数组di
int v[n],w[n];
为表达方便,如下代码使用数组
这里用一种我从未见过的表达方式:
用dp[i][j]表示以j为剩余容量,选择性的放入前i个物品的最大价值。
初始化:
dp[0][j]=dp[i][0]=0;
进入下一步的选择:
对于每个物品,你有两个选择:
容量不足,装不下它:
此时的价值==前i-1个物品时的价值,即dp[i][j]=dp[i-1][j]
容量足以装下它,but不必定能达到当前最优价:
在选与不选中选择一个最优的,即dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};
其中dp[i-1][j]为不装状况,dp[i-1][j-w[i]]+v[i]为装的状况
这就是递推式了
dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};