一维数组解决背包问题

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. int main()
  7. {
  8. int N, M;
  9. scanf_s("%d%d", &N, &M);
  10. int need[503], value[503];
  11. for (int i = 0; i < N; i++)
  12. {
  13. scanf_s("%d%d", &need[i], &value[i]);
  14. }
  15. int dp[100010];
  16. memset(dp, 0, sizeof(dp));
  17. /**
  18. f(j)=max(f(j),f(j-need(j));
  19. */
  20. for (int i = 0; i < N; i++)
  21. for (int j = M; j >= need[i]; j--)
  22. dp[j] = max(dp[j], dp[j - need[i]] + value[i]);
  23. printf_s("%d\n", dp[M]);
  24. return 0;
  25. }

完全背包问题

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. const int maxn = 1e5 + 10;
  6. using namespace std;
  7. int main()
  8. {
  9. int dp[maxn], w[101], v[101];
  10. int n, m;
  11. cin >> n >> m;
  12. for (int i = 0; i < n; i++) cin >> w[i] >> v[i];
  13. memset(dp, 0, sizeof(dp));
  14. for (int i = 0; i < n; i++)
  15. for (int j = w[i]; j <= m; j++)
  16. dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
  17. cout << dp[m];
  18. return 0;
  19. }