- yuxitong's blog
背包问题
- @ 2025-10-18 18:11:15
01背包
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
int T, M, tim[105], vl[105], dp[1005];//背包重量,物品个数,物品重量,物品价值
int main(){
cin >> T >> M;
memset(dp, -1, sizeof(dp));
for (int i = 1; i <= M; i++){
cin >> tim[i] >> vl[i];
}
dp[0] = 0;
for (int i = 1; i <= M; i++){
for (int j = T; j >= tim[i]; j--){
dp[j] = max(dp[j], dp[j - tim[i]] + vl[i]);
}
}
cout << dp[T] << endl;
return 0;
}
输入:
70 3
71 100
69 1
1 2
输出:
3
完全背包
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
int m, n, wei[35], vl[35], dp[205]; //背包重量,物品个数,物品重量,物品价值
int main(){
cin >> m >> n;
memset(dp, -1, sizeof(dp));
for (int i = 1; i <= n; i++){
cin >> wei[i] >> vl[i];
}
dp[0] = 0;
for (int i = 1; i <= n; i++){
for (int j = wei[i]; j <= m; j++){
dp[j] = max(dp[j], dp[j - wei[i]] + vl[i]);
}
}
cout << dp[m] << endl;
return 0;
}
输入:
10 4
2 1
3 3
4 5
7 9
输出:
12
多重背包
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
int n, V, v[105], w[105], cnt, f[105]; //物品数量,背包重量,物品重量,物品价值,新的物体数
int main(){
cin >> n >> V;
int a, b, s; //s表示物体个数
for (int i = 1; i <= n; i++){
cin >> a >> b >> s;
int k = 1; //枚举个数
while (k <= s){ //将每个物体按二进制合成
v[++cnt] = k * a;
w[cnt] = k * b;
s -= k;
k *= 2;
}
if (s){ //还留着
v[++cnt] = s * a;
w[cnt] = s * b;
}
}
for (int i = 1; i <= n; i++){ //就是01背包
for (int j = V; j >= v[i]; j--){
f[j] = max(f[j], f[j - v[i]] + w[i]);
}
}
cout << f[V] << endl;
return 0;
}
INPUT:
4 5
1 2 3
2 4 1
3 4 3
4 5 2
OUTPUT:
10
分组背包
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
int n, m, x, cnt, wei[10005], vl[10005], group[10005], dp[10005];//物品个数,背包重量,组数,总组数,物品重量,物品价值,小组中的物品个数
int ids[205][205]; //ids[i][j]表示组数i中物品j的编号
int main(){
cin >> m >> n;
for (int i = 1; i <= n; i++){
cin >> wei[i] >> vl[i] >> x;
cnt = max(cnt, x);
group[x]++;
ids[x][group[x]] = i;
}
for (int i = 1; i <= cnt; i++){
for (int j = m; j >= 0; j--){
for (int k = 1; k <= group[i]; k++){
if (j >= wei[ids[i][k]]){
dp[j] = max(dp[j], dp[j - wei[ids[i][k]]] + vl[ids[i][k]]);
}
}
}
}
cout << dp[m] << endl;
return 0;
}
INPUT:
45 3
10 10 1
10 5 1
50 400 2
OUTPUT:
10