01背包问题

题目来源

https://www.acwing.com/problem/content/description/2/

思路

基本按照该文章 https://www.jianshu.com/p/a66d5ce49df5 思路码出的代码,感觉动态规划的本质还是在不断的打表,空间上还能用滚动数组优化,先挖个坑以后再补

代码

#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 1005
int dp[MAXN][MAXN];//dp[n][v]前n个数在重量为v的情况下代表的价值

int main()
{
    int N,V;
    cin>>N>>V;
    int v[MAXN]={0};
    int w[MAXN]={0};
    for(int i = 1; i <= N; i ++)
    {
        cin>>v[i]>>w[i];
    }
    for(int i = 1; i <= N; i ++)//以1为初始值是因为默认dp[0][0]为0,方便代码书写 
    {
        for(int j = 1; j <= V; j ++)
        {
            if(j >= v[i])
            {
                dp[i][j] = max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);//转移方程 
            }
            else
            {
                dp[i][j] = dp[i-1][j];
            }
        }
    }
    cout<<dp[N][V];
    return 0;
}


 
 
原文地址:https://www.cnblogs.com/rebloom000/p/13971032.html