动态规划模板3|0-1背包问题

二维数组0-1背包模板

// 01 背包 二维数组
#include <iostream>
#include <string.h>
using namespace std;

int dp[21][1010];
int w[21],c[21];

int main() {
    int N,V;
    cin>>N>>V;
    for(int i=1;i<=N;i++){
        cin>>w[i]>>c[i];
    }
    
    //核心部分
    for(int i = 1;i<=N;i++){
        for(int j = 0;j<=V;j++){
            if(j>=c[i]){
                dp[i][j] = max(dp[i-1][j-c[i]] + w[i],dp[i-1][j]);
            }else{
                dp[i][j] = dp[i-1][j];
            }
        }
    }

    cout<<dp[N][V]<<endl;
    return 0;
}

一维数组0-1背包模板

0-1背包一维数组(滚动数组逆序大推小)
int dp[MAX_V];

for (int i = 1; i <= n; ++i)
    for (int j = v; j >= w[i]; --j)
        dp[j] = max(dp[j - w[i]] + v[i], dp[j]);

猜你喜欢

转载自www.cnblogs.com/fisherss/p/10318537.html