标签:
题意比较简单,这道题比较特别的地方是01背包中,每个物体有一个价值有一个重量,比较价值最大,重量受限,这道题是价值受限情况下最大,也就值把01背包中的重量也改成价值。
//Problem : 1171 ( Big Event in HDU ) Judge Status : Accepted #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int v[6000], dp[5000 * 50 + 10]; int main() { //freopen("in.txt", "r", stdin); int n; int sum; while (scanf("%d", &n) != EOF && n >= 0) { memset(dp, 0, sizeof(dp)); int a, b; sum = 0; int idx = 0; for (int i = 1; i <= n; i++) { scanf("%d%d", &a, &b); sum += a * b; for (int j = 0; j < b; j++) { v[++idx] = a; } } for (int i = 1; i <= idx; i++) for (int j = sum / 2; j >= v[i]; j--) dp[j] = max(dp[j], dp[j - v[i]] + v[i]); printf("%d %d\n", sum - dp[sum / 2], dp[sum / 2]); } return 0; }
和上面一样,没有重量,只有价值。
如果卡上不足5元,输出原值。如果大于5元,就在m-5范围内花最多的钱(留下最贵的菜),然后用剩下的钱减去最贵的菜。
代码
//Problem : 2546 ( 饭卡 ) Judge Status : Accepted #include <iostream> #include <algorithm> using namespace std; int v[1005]; int dp[1005]; int main() { int n, m; while (cin >> n && n) { memset(dp, 0, sizeof(dp)); //又忘记初始化然后wa了一发。。。 for (int i = 1; i <= n; ++i) { cin >> v[i]; } cin >> m; if (m < 5) { printf("%d\n", m); continue; } sort(v + 1, v + n + 1); for (int i = 1; i < n; ++i) { for (int j = m - 5; j >= v[i]; j--) dp[j] = max(dp[j], dp[j - v[i]] + v[i]); } printf("%d\n", m - dp[m - 5] - v[n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wenruo/p/4506652.html