背包问题
经典0-1背包
总的来说就是物品选择与不选的问题
1.不选择 dp[i][j] = dp[i-1][j]
2.选择 dp[i][j] = max(dp[i][j] , dp[i-1][j-v[i] + w[i])
dp[i][j]表示 只选择前i个物品,体积为j的情况下的可选的最大价值
未优化代码如下:
#include <iostream> #include <algorithm> using namespace std; const int N = 1010; int v[N],w[N]; int dp[N][N]; int main(){ int n,m; cin>> n >> m; for(int i = 1; i <= n; i++){ cin>> v[i] >> w[i]; } int res = 0; for(int i = 1; i <= n; i++){ for(int j = 0; j <= m; j++){ dp[i][j] = dp[i-1][j]; if(j >= v[i]) dp[i][j] = max(dp[i][j] , dp[i-1][j-v[i]] + w[i]); } } for(int i = 0; i <= m; i++){ res = max(res,dp[n][i]); } cout<<res<<endl; return 0; }
可以将该代码从二维直接优化到一位空间,
dp[j] 表示背包体积为j时可以选择的最大价值
优化后代码如下:
#include <iostream> using namespace std; const int N = 1010; int dp[N]; int main(){ int n,m,v,w; cin>> n >> m; for(int i = 1; i <= n; i++){ cin>> v >> w; for(int j = m; j >= v; j--){ dp[j] = max(dp[j - v]+w,dp[j]); } } cout<<dp[m]<<endl; }

浙公网安备 33010602011771号