动态规划思路
-
定义状态:
- 用
dp[i][j]
表示前i
个物品恰放入一个容量为j
的背包可以获得的最大价值。
- 用
-
状态转移方程:
- 如果不放第
i
个物品,那么dp[i][j] = dp[i-1][j]
。 - 如果放第
i
个物品,且j >= W[i]
,那么dp[i][j] = max(dp[i-1][j], dp[i-1][j-W[i]] + V[i])
。
- 如果不放第
-
初始化:
- 当没有任何物品可选择时,即
i = 0
,所有dp[0][j] = 0
。 - 当背包容量为 0 时,即
j = 0
,所有dp[i][0] = 0
。
- 当没有任何物品可选择时,即
-
最终结果:
dp[N][totalWeight]
即为所求的最大价值。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int totalWeight,N;
cin>>totalWeight>>N;
vector<int> value(N+1);
vector<int> weight(N+1);
for (int i = 1; i <=N; i++)
{
cin>>weight[i]>>value[i];
}
vector<vector<int>> dp(N+1,vector<int>(totalWeight+1, 0));
for(int i=0;i<=N;i++)
{
for (int j = 1; j <= totalWeight; j++)
{
if(j<weight[i])//说明装不下
{
dp[i][j]=dp[i-1][j];
}
else{//能装下,但是也要考虑,装?不装,对应的情况
dp[i][j]=max(dp[i-1][j - weight[i]] + value[i],dp[i-1][j]);
//dp[i-1][j - weight[i]] + value[i]对应装的 情况
//dp[i-1][j]对应不装的 情况
}
}
}
cout<<dp[N][totalWeight]<<endl;
return 0;
}