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背包问题,你该了解这些01背包问题,你该了解这些 滚动数组 416. 分割等和子集

0-1背包问题的回溯法中,剪枝用的上界函数问题

把01背包问题的底裤扒个底朝天!!!

用回溯法求01背包问题,怎样使用C++模板啊,迫切求指点!

c语言背包问题,求高手解答