洛谷P1048 采药【01背包】

输入 #1

70 3
71 100
69 1
1 2

输出 #1

3

思路:经典01背包问题,用了二维以及优化的一维两种方法来写,关键是其状态方程。

二维:

#include<bits/stdc++.h>
using namespace std;
int dp[105][1005];
int w[105], v[105];
int main() {
    int t, m; cin >> t >> m;
    for (int i = 1; i <= m; ++i)cin >> w[i] >> v[i];
    for (int i = 1; i <= m; ++i)
        for (int j = 1; j <= t; ++j)
            if (j < w[i])
                dp[i][j] = dp[i - 1][j];
            else
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
    cout << dp[m][t] << endl;
}

一维

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int dp[1005];
int w[105], v[105];
int main(){
    int t, m;
    scanf("%d %d", &t, &m);
    for (int i = 1; i <= m; ++i)
        scanf("%d %d", &w[i], &v[i]);
    for (int i = 1; i <= m; ++i)
        for (int j = t; j >= w[i]; --j)
            dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
    cout << dp[t] << endl;
    return 0;
}
posted @ 2020-08-12 15:34  不过6级、不改名  阅读(150)  评论(0)    收藏  举报