我是靠谱客的博主 坚强樱桃,最近开发中收集的这篇文章主要介绍01背包2,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

有n个重量和价值分别为wi,vi的物品。从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值。

限制条件1<=n<=100,1<=wi<=10000000,1<=vi<=100,1<=W<=1000000000

 

和最初的01背包相比,只是修改了限制条件的大小。此前的复杂度是O(nW),对于这里就不可行了。

相比较重量而言,价值的范围比较小,试着改变dp的对象。

此前针对不同的重量限制计算最大的价值,现在针对不同的价值计算最小的重量。

 

定义dp[i+1][j]为从前i个物品中挑选出价值总和为j时总重量的最小值(不存在即为INF)

dp[0][0]=0

dp[0][j]=INF

易得递推关系式为dp[i+1][j]=min(dp[i][j],dp[i][j-v[i]]+w[i])

答案就是dp[n][j]中令dp[n][j]<=W的最大j

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<memory.h>
 4 #define INF 100000000
 5 using namespace std;
 6 const int max_n=101;
 7 int w[max_n+1];
 8 int v[max_n+1];
 9 int n,r;
10 long long W;
11 long long total=0;
12 int main()
13 {
14
cin>>n;
15
for(int i=0;i<n;i++)
16 
{
17
cin>>w[i]>>v[i];
18
total+=v[i];
19 
}
20
cin>>W;
21
long long dp[n+1][total+1];
22
fill(dp[0],dp[0]+total+1,INF);
23
dp[0][0]=0;
24
for(int i=0;i<n;i++)
25 
{
26
for(int j=0;j<=total;j++)
27 
{
28
if(j<v[i])
29 
{
30
dp[i+1][j]=dp[i][j];
31 
}
32
else
33 
{
34
dp[i+1][j]=min(dp[i][j],dp[i][j-v[i]]+w[i]);
35 
}
36 
}
37 
}
38
int res;
39
for(int i=0;i<=total;i++)
40 
{
41
if(dp[n][i]<=W) res=i;
42 
}
43
cout<<res<<endl;
44
return 0;
45 }
View Code

 

转载于:https://www.cnblogs.com/wangkaipeng/p/6429779.html

最后

以上就是坚强樱桃为你收集整理的01背包2的全部内容,希望文章能够帮你解决01背包2所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部