背包问题总结
1、0-1背包问题
Acwing2. 01背包问题
有
N
N
N 件物品和一个容量是
V
V
V 的背包。每件物品只能使用一次。
第 i i i 件物品的体积是 v i v_i vi,价值是 w i w_i wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,
N
N
N,
V
V
V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N N N 行,每行两个整数 v i v_i vi, w i w_i wi,用空格隔开,分别表示第 i i i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0
<
N
,
V
≤
1000
0<N,V\leq1000
0<N,V≤1000
0
<
v
i
,
w
i
≤
1000
0<v_i,w_i\leq1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1005;
int w[MAX];
int v[MAX];
int f[MAX];
int main(){
//此时应该需要做的就是 下标表示物品,f[j] 表示在j的容量之下 的最大价值 因此就可以这样进行优化
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> v[i] >> w[i];
//v 表示容量 w 表示体积
for(int i =1;i<=n;i++){
for(int j =m;j>=v[i];j--){
// 没有加第i个的物品的时候的价值
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m];
}
2、完全背包问题
有 N N N 种物品和一个容量是 V V V 的背包,每种物品都有无限件可用。
第 i i i 种物品的体积是 v i v_i vi,价值是 w i w_i wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,
N
,
V
N,V
N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N N N 行,每行两个整数 v i , w i v_i,w_i vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0
<
N
,
V
≤
1000
0<N,V\leq1000
0<N,V≤1000
0
<
v
i
,
w
i
≤
1000
0<v_i,w_i\leq1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int n,m;
int v[N],w[N];
int f[N];
int main(){
cin>>n>>m;
for(int i =1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i =1;i<=n;i++){
for(int j =v[i];j<=m;j++){
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m];
return 0;
}
3、背包问题后续
标签:总结,输出,背包,int,问题,体积,物品,价值 来源: https://blog.csdn.net/qq_37400901/article/details/122285807
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。