01背包问题
Posted doubest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01背包问题相关的知识,希望对你有一定的参考价值。
题目链接:
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; }
以上是关于01背包问题的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第四十二天 | 01背包问题,你该了解这些01背包问题,你该了解这些 滚动数组 416. 分割等和子集