一维数组解决背包问题
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int main(){ int N, M; scanf_s("%d%d", &N, &M); int need[503], value[503]; for (int i = 0; i < N; i++) { scanf_s("%d%d", &need[i], &value[i]); } int dp[100010]; memset(dp, 0, sizeof(dp)); /** f(j)=max(f(j),f(j-need(j)); */ for (int i = 0; i < N; i++) for (int j = M; j >= need[i]; j--) dp[j] = max(dp[j], dp[j - need[i]] + value[i]); printf_s("%d\n", dp[M]); return 0;}
完全背包问题
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>const int maxn = 1e5 + 10;using namespace std;int main(){ int dp[maxn], w[101], v[101]; int n, m; cin >> n >> m; for (int i = 0; i < n; i++) cin >> w[i] >> v[i]; memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++) for (int j = w[i]; j <= m; j++) dp[j] = max(dp[j], dp[j - w[i]] + v[i]); cout << dp[m]; return 0;}