题目链接:
https://www.acwing.com/problem/content/2/
题解:
关于DP问题,我们一般可以用一套模式去分析
1、分析状态表示f(i,j):
1)f(i,j)表示哪个集合?在01背包问题中,它表示选法的一个集合
2)i,j表示什么条件?在01背包问题中,它表示前i个物品,总体积小于等于j
3)f(i,j)的属性含义是什么?一般有max,min,数量。在01背包问题,它表示最大价值,是max类型
2、分析状态计算:
本质上就是对当前集合f(i,j)进行一个划分:
要求是不重不漏,在这里,我们可以将其划分为包含i的集合和不包含i的集合。
包含i的集合表示为:f(i,j) = f(i-1,j);
不包含i的集合表示为:f(i,j) = f(i-1,j-v[i])+w[i];
AC代码:
#include <iostream> #include <algorithm> using namespace std; const int N = 1010; int n,m; int v[N],w[N]; int f[N][N]; int main(){ cin >> n >> m; for(int i=1;i<=n;i++) cin >> v[i] >> w[i]; for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ f[i][j] = f[i-1][j]; if(j >= v[i]){ f[i][j] = max(f[i-1][j],f[i-1][j-v[i]]+w[i]); } } } cout << f[n][m] << endl; return 0; }