0-1背包问题 knapsack
对于0-1背包问题,状态方程为
其中dp[i][v]为前i个物品恰好放入一个容量为v的背包可以获得最大价值。
dp[i][v]=max(dp[i-1][v],dp[i-1][v-weights[i]]+value[i]);
#include <bits/stdc++.h>
using namespace std;
int main() {
int N, V;//N为物品个数 V为背包的容量
cin >> N >> V;
int weights[1000];
int value[1000];
int dp[1000] = { 0 };
for (int i = 1; i <= N; i++)
cin >> weights[i] >> value[i];
for (int i = 1; i <=N; i++) {
for (int j = V; j >= 1; j--) {//此处是逆序循环是为了保存前i-1的dp数组状态,以免被覆盖
if (j < weights[i]) break;//背包无法容纳该物品
dp[j] = max(dp[j - weights[i]] + value[i],dp[j]);
}
}
cout << dp[V] << endl;
return 0;
}
vector的封装形式
#include <bits/stdc++.h>
using namespace std;
int knapsack(int N,int V, vector<int>& weights, vector<int>& value) {//N为物品个数 V为背包的容量
vector<int> dp(V+1);
for (int i = 1; i <= N; i++) {
for (int j = V; j >= 1; j--) {
if (j < weights[i]) break;
dp[j] = max(dp[j], dp[j - weights[i]] + value[i]);
}
}
return dp[V];
}
int main() {
int N, V;//N为物品个数 V为背包的容量
cin >> N >> V;
vector<int> weights(N+1,0);
vector<int> value(N + 1,0);
int wei, val;
for (int i = 1; i <= N; i++) {
cin >> wei >> val;
weights[i] = wei;;
value[i]=val;
}
int res = knapsack(N, V, weights, value);
cout << res << endl;
return 0;
}