背包问题

来源:互联网 发布:很有节奏感的网络歌曲 编辑:程序博客网 时间:2024/06/03 20:10


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;}


0 0