Bootstrap

各种背包(01背包, 完全背包, 多重背包)(SDNUOJ1033采药)(SDNUOJ1043采药2)

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])

[cpp]  view plain  copy
  1. for (int i = 1; i <= N; i++)  //从1开始(从0开始f[i-1][j]会越界)判断每个物品能否放进  
  2.         for (int j = 1; j <= W; j++)  //对每个状态进行判断  
  3.         {    
  4.             if (w[i] <= j)//能放进去  
  5.             {    
  6.                 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);    
  7.             }    
  8.             else    
  9.                 dp[i][j] = dp[i-1][j];    
;