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;
}
原文地址:https://www.cnblogs.com/doubest/p/12286470.html