- gf24160 的博客
0-1背包
- 2025-7-17 20:38:42 @
看一个样例
【题目描述】 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,...,Cn,求旅行者能获得最大总价值。
【输入】第一行:两个整数,MM(背包容量,M<=200M<=200)和N(物品数量,N<=30N<=30);第2..N+12..N+1行:每行二个整数Wi,Ci,Wi,Ci,表示每个物品的重量和价值。
【输出】 仅一行,一个数,表示最大总价值。
【输入样例】
2 1
3 3
4 5
7 9
10 4
【输出样例】
12
//用的是二层数组
//1先分析
#include <bits/stdc++.h>
using namespace std;
int n,m,v[250],w[205];//2确定状态变量
int b[2][205]; //4确定边界值这里为0不必额外变换
int main() {
ios::sync_with_stdio(false);//关闭cin cout输入输出和scanf printf的同步状态
cin.tie(0);
cout.tie(0);
long long n;
cin>>m>>n;//输入数据
for(int i=1;i<=n;++i){
cin>>w[i]>>v[i];
}
for(int i=1;i<=n;++i){
for(int j=0;j<=m;++j){
b[i%2][j]=b[(i+1)%2][j];//如果不变则选上一次的
if(j>=w[i])b[i%2][j]=max(b[i%2][j],b[(i+1)%2][j-w[i]]+v[i]);//3状态转移方程
}
}
cout<<b[n%2][m];//5 得到答案
return 0;
}
一共就五步
- 1.分析是否可以用
- 2.定义状态变量
- 3.状态转移方程
- 4.确定边界值
- 5.得出答案