1、确定状态标识
dp[i][j]:在背包容量j时,从1-i号物品最大价值
2、边界与遍历顺序
依旧是两层for循环
3、状态转移方程:在当前i层进行叠加
4、模拟过程
5.代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int wi[1005], vi[1005];//体积,价值
int dp[1005][1005];
int main()
{
int v, n;
cin >> v >> n;
for (int i = 1; i <= n; i++)
cin >> wi[i] >> vi[i];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= v; j++)
{
dp[i][j] = dp[i - 1][j];
if (j >= wi[i])//在第i行进行叠加
dp[i][j] = max(dp[i][j], dp[i][j - wi[i]] + vi[i]);
//cout << dp[i][j] << " ";
}
//cout << endl;
}
cout << dp[n][v] << endl;
return 0;
}