[关闭]
@yuyuesheng 2019-02-26T20:13:07.000000Z 字数 1176 阅读 752

G - FATE

题意:
xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?
题解:
dp[i][j]表示杀i只怪不超过j忍耐度时获得的最大经验值,完全背包模板。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. int main()
  6. {
  7. int dp[105][105];
  8. int n, m, k, s, v[105], c[105], ans;
  9. while (cin >> n >> m >> k >> s)
  10. {
  11. memset(dp, 0, sizeof(dp));
  12. for (int i = 0; i < k; i++)
  13. cin >> v[i] >> c[i];
  14. for (int i = 0; i < k; i++)
  15. for (int j = 1; j <= s; j++)
  16. for (int l = c[i]; l <= m; l++)
  17. dp[j][l] = max(dp[j - 1][l - c[i]] + v[i], dp[j][l]);
  18. ans = -1;
  19. for (int i = 0; i <= m; i++)
  20. if (dp[s][i] >= n)
  21. {
  22. ans = m - i;
  23. break;
  24. }
  25. cout << ans << endl;
  26. }
  27. }

H - Partial Tree

题意:
构造一棵树使得这棵树的价值最大。树的价值等于节点价值的和,节点的价值等于度数i的函数f(i)。
题解:
转化为完全背包,背包的容量为2n−2,我们要恰好选n个物品而且要恰好装满背包。体积为i的物品的价值为f(i),而且每种物品有无穷多个。所以可以设计出类似的状态:d(i,j)表示选了i件物品,体积为j时所能得到的最大价值。

  1. #include <cstring>
  2. #include <algorithm>
  3. #include<iostream>
  4. using namespace std;
  5. const int maxn = 2050;
  6. int n;
  7. int f[maxn];
  8. int d[2][maxn];
  9. int main()
  10. {
  11. int t;
  12. cin >> t;
  13. while (t--) {
  14. cin >> n;
  15. for (int i = 1; i < n; i++)
  16. cin >> f[i];
  17. memset(d, 0, sizeof(d));
  18. int cur = 1;
  19. d[1][0] = n * f[1];
  20. for (int i = 2; i <= n - 1; i++) {
  21. cur ^= 1;
  22. memset(d[cur], 0, sizeof(d[cur]));
  23. for (int j = 0; j < i - 1; j++)
  24. d[cur][j] = d[cur ^ 1][j];
  25. for (int j = i - 1; j <= n - 2; j++)
  26. d[cur][j] = max(d[cur ^ 1][j], d[cur][j - i + 1] + f[i] - f[1]);
  27. }
  28. cout << d[cur][n - 2] << endl;
  29. }
  30. return 0;
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注