1.01背包问题
有N种物品与承重为W的背包。每种物品只有一件,每个物品都有对应的重量w[i]与价值v[i],求解如何装包使得价值最大。
w[i]表示i物品的重量
v[i]表示i物品的价值
f[i][j]表示有i个物品 ,容量为j时的最优解
W总容积
N物品个数
当变成i+1个物品时
第i+1个物品不放进背包dp[i+1][j]=dp[i][j]
第i+1个物品放进背包dp[i+1][j]=dp[i][j-w[i+1]]+v[i+1]
状态方程:dp[i+1][j]=max(dp[i][j], dp[i][j-w[i+1]]+v[i+1])
- for (int i = 1; i <= N; i++) //从1开始(从0开始f[i-1][j]会越界)判断每个物品能否放进
- for (int j = 1; j <= W; j++) //对每个状态进行判断
- {
- if (w[i] <= j)//能放进去
- {
- dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
- }
- else
- dp[i][j] = dp[i-1][j];