hihocoder 1038. 01 背包
dp[i] 表示使用掉 i 张奖券(消耗掉 i 的空间)后,能获得的最大价值。
代码:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
// Input
int n, m;
cin >> n >> m;
vector<int> needs, values;
while (n -- != 0) {
int need, value;
cin >> need >> value;
needs.push_back(need);
values.push_back(value);
}
// DP
// Initialization
vector<int> dp(m + 1, 0);
// Start
for (size_t i = 0; i < needs.size(); ++ i)
for (int j = m; j >= needs[i]; -- j)
dp[j] = max(dp[j], dp[j - needs[i]] + values[i]);
cout << dp[m] << endl;
}
hihocoder 1043. 完全背包
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> need(N), value(N);
vector<int> dp(M + 1, 0);
for (int i = 0; i < N; ++ i)
cin >> need[i] >> value[i];
for (int i = 0; i < N; ++ i)
for (int j = need[i]; j <= M; ++ j)
dp[j] = max(dp[j], dp[j - need[i]] + value[i]);
cout << dp[M] << endl;
}