01背包问题

题目来源https://www.acwing.com/problem/content/2/


算法1:
二维数组+动态规划
动态规划知识先导
状态转换方程:
定义f[i][j]:前i个物品,背包容量j下的最优解
(1) 当前背包容量不够(j<w[i]),为前i-1个物品最优解:
f[i][j]=f[i-1][j]
(2) 当前背包容量够,判断选与不选第i个物品
选:f[i][j] = f[i-1][j-w[i]] + v[i]
不选:f[i][j] = f[i-1][j]
参考代码:

#include<bits/stdc++.h>
using namespace std;
int N,V;
int v[1020],w[1020];
int dp[1020][1020];
int main()
{
    cin>>N>>V;
    for(int i=1;i<=N;i++)
        cin>>v[i]>>w[i];
    for(int i=1;i<=N;i++)
    {
        for(int j=V;j>=0;j--)
        {
            if(j>=v[i])
                dp[i][j]=max(dp[i-1][j-v[i]]+w[i],dp[i-1][j]); 
            else
                dp[i][j]=dp[i-1][j];
        }
    }
    cout<<dp[N][V];
    return 0;
}
posted @ 2020-11-18 20:56  hnkjdx_react  阅读(74)  评论(0编辑  收藏  举报