01背包(动态规划):
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
int main() {
int weight[105], value[105];
int n, V, Max;
scanf("%d %d", &n, &V);
for(int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= V; j++) {
if(j - weight[i] >= 0 && j - weight[i] <= V) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
printf("%d", dp[n][V]);
}
01背包(动态规划优化版):
#include<bits/stdc++.h>
using namespace std;
int dp[105];
int main() {
int weight[105], value[105];
int n, V, Max;
scanf("%d %d", &n, &V);
for(int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
}
for(int i = 1; i <= n; i++) {
for(int j = V; j >= 1; j--) {
if(j - weight[i] >= 0 && j - weight[i] <= V) {
dp[j] = max(dp[j],dp[j - weight[i]] + value[i]);
} else {
dp[j] = dp[j];
}
}
}
printf("%d", dp[V]);
}
完全背包(动态规划):
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
int main() {
int weight[105], value[105];
int n, V, Max;
scanf("%d %d", &n, &V);
for(int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= V; j++) {
if(j - weight[i] >= 0 && j - weight[i] <= V) {
dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
printf("%d", dp[n][V]);
}
完全背包(动态规划优化版):
#include<bits/stdc++.h>
using namespace std;
int dp[105];
int main() {
int weight[105], value[105];
int n, V, Max;
scanf("%d %d", &n, &V);
for(int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= V; j++) {
if(j - weight[i] >= 0 && j - weight[i] <= V) {
dp[j] = max(dp[j],dp[j - weight[i]] + value[i]);
} else {
dp[j] = dp[j];
}
}
}
printf("%d", dp[V]);
}
多重背包(动态规划):
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
int main() {
int weight[105], value[105];
int n, V, Max, k[105];
scanf("%d %d", &n, &V);
for(int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &k[i]);
}
for(int i = 1; i <= n; i++) {
for(int v = weight[i]; v <= V; v++) {
dp[i][v] = 0;
int nCount = min(k[i], v / weight[i]); //是当前背包容量v,而不是背包的总容量
for(int w = 0; w <= nCount; w++) {
dp[i][v] = max(dp[i][v], dp[i - 1][v - w * weight[i]] + w * value[i]);
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= V; j++) {
printf("%d ", dp[i][j]);
}
printf("\n");
}
printf("%d", dp[n][V]);
}