先看看01背包模板吧
01背包问题
题目
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤10000 0<vi,wi≤10000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:8
#include<iostream>
using namespace std;
int m,n;
int f[1010];
int main(){
cin>>m>>n;
for(int i=0;i<n;i++){
int v,w;
cin>>v>>w;
for(int j=m;j>=v;j--){
f[j]=max(f[j],f[j-v]+w);
}
}
cout<<f[m];
}
再看看此题
【何老板雨林探险系列】准备出发 | |
|
问题描述
智勇超群的何老板决定独自去南美亚马逊流域的雨林探险。他为这次探险精心的准备了n个物品。但是何老板只有两个背包,由于背包容量的限制,可能无法将这n个物品都带在身上。于是何老板将每个物品都标记了一个重要度,他想让两个背包装的物品的重要度总和最大。问,这个最大值是多少?
输入格式
第一行,三个空格间隔的整数n,x,y分别表示物品的个数,背包一和背包二的容积
第二行,空格间隔的n个整数,分别表示物品的体积
第三行,空格间隔的n个整数,分别表示物品的重要度
输出格式
一行,一个整数,表示最大值
样例输入
5 10 6
3 7 2 5 1
12 20 4 5 1
样例输出
38
提示
0<=n<=100
0<=x,y<=300
0<=每个物品的体积<=500
0<=每个物品的价值<=1000
稍微变一变就好了
AC代码:
#include<iostream>
using namespace std;
int v[1000],w[1000],f[1000];
int main(){
int n,x,y;
cin>>n>>x>>y;
for(int i=0;i<n;i++){
cin>>v[i];
}
for(int i=0;i<n;i++){
cin>>w[i];
}
for(int i=0;i<n;i++){
for(int j=x+y;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[x+y];
}