P1616 疯狂的采药(完全背包)

完全背包问题

二维:dp[i][j]=max(dp[i-1][j],dp[i][j-a[i].t]+a[i].value);//只考虑当前层的状态,所以第二层循环是正序。

一维:dp[j]=max(dp[j],dp[j-a[i].t]+a[i].value);

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long int ll;
struct node{
    int t,value;
}a[1000005];
vector<ll >dp(1000005);

int main()
{
    int n,k;cin >> k>>n;
    for (int i = 0;i < n;i++){
            cin >> a[i].t>>a[i].value;
    }
    dp.clear();
    for (int i = 0;i < n;i++) {
        for (int j = a[i].t;j <= k;j++) {
                dp[j] = max(dp[j], dp[j - a[i].t]+a[i].value);
        }
    }
    cout << dp[k]<<endl;
    return 0;
}
/*
6
3 34 4 12 5 2
9
*/

 

posted @ 2020-05-15 14:15  mohari  阅读(147)  评论(0编辑  收藏  举报