背包4

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

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

Input:

输入包含多组测试用例,每一例的开头为两位整数 n、W;接下来有 n 行,每一行有两位整数 Wi、Vi
其中:
1<=n<=100
1<=W<=1000,000,000(10^9)
1<=Wi<=10,000,000(10^7)
1<=Vi<=100。

Output:

输出为一行,即所有方案中价值总和的最大值。

Sample Input:

4 5
2 3
1 2
3 4
2 2
4 10000000
2 3
2 2
3 3
1 2

Sample Output:

7
10
解题思路:相比01背包,这题只是修改了限制条件的大小,此前求解这一问题的时间复杂度是O(nW),但是对于这一问题,W最大为10^9,显然使用之前的方法会超时。但是可以发现,相比较重量而言,价值的范围比较小,因此换种角度可以解决此题。之前的方法中,dp[j]是求解当前重量j不超过总重量W下的最大价值,而这次的dp[i][j]表示从前i个物品中挑选价值总和为j(从0开始枚举)时总重量的最小值(不存在时就是一个充分大的INF)。因此最终的答案就对应于令dp[n][i]<=W的最大的i(i从总价值V~0枚举)。
二维数组状态转移方程:dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+w[i])。
一维数组状态转移方程:dp[j]=min(dp[j],dp[j-v[i]]+w[i])(j:V~v[i])。
AC代码一:二维数组实现。
 #include<bits/stdc++.h>
using namespace std;
int n,W,V,w[],v[],dp[][];
int main(){
while(cin>>n>>W){
memset(dp,0x3f,sizeof(dp));
V=,dp[][]=;//从前0个物品挑选出价值总和为0的最小重量为0
for(int i=;i<=n;++i)
cin>>w[i]>>v[i],V+=v[i];
for(int i=;i<=n;++i){
for(int j=;j<=V;++j){
if(j<v[i])dp[i][j]=dp[i-][j];
else dp[i][j]=min(dp[i-][j],dp[i-][j-v[i]]+w[i]);
}
}
for(int i=V;i>=;--i)//找最大价值的物品且得放进重量为W的背包里面
if(dp[n][i]<=W){cout<<i<<endl;break;}
}
return ;
}
AC代码二:一维数组实现。
 #include<bits/stdc++.h>
using namespace std;
int n,W,V,w[],v[],dp[];
int main(){
while(cin>>n>>W){
memset(dp,0x3f,sizeof(dp));//初始化为无穷
V=,dp[]=;//价值总和为0的最小重量为0
for(int i=;i<=n;++i)
cin>>w[i]>>v[i],V+=v[i];//累加价值
for(int i=;i<=n;++i)
for(int j=V;j>=v[i];--j)
dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
for(int i=V;i>=;--i)//找最大价值的物品且得放进重量为W的背包里面
if(dp[i]<=W){cout<<i<<endl;break;}
}
return ;
}

ACM_01背包2的更多相关文章

  1. ACM_01背包(恰好装满)

    背包2 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量刚好为 W ...

  2. ACM_01背包

    背包1 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量不超过 W ...

  3. 【USACO 3.1】Stamps (完全背包)

    题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...

  4. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  5. HDU2159 二维完全背包

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. CF2.D 并查集+背包

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...

  7. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  8. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

  9. POJ1717 Dominoes[背包DP]

    Dominoes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6731   Accepted: 2234 Descript ...

随机推荐

  1. POJ 2828 Buy Tickets (线段树 || 树状数组)

    题目大意 一些小朋友在排队,每次来一个人,第i个人会插到第x个人的后面.权值为y.保证x∈[0,i-1]. 按照最后的队伍顺序,依次输出每个人的权值. 解题分析 好气吖.本来是在做splay练习,然后 ...

  2. msp430入门编程05

    msp430中C语言的运算符和表达式 msp430中C语言的程序结构06 msp430中C语言的函数及实现07 msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 m ...

  3. How many ways?? 矩阵快速幂 邻接矩阵意义

    春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室 ...

  4. Codeforces 631D Messenger【KMP】

    题意: 给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s. 分析: KMP 这题唯一需要思考的地方就是如何处理字符串块.第一想到是把他们都展开然后进行KMP,可是展开后实在 ...

  5. 记 SpringBoot1.* 转 Springoot2.0 遇到的问题

    1.拦截器问题 到2.0之后在配置文件中写 static-path-pattern: /static/** 已经不起作用(2.0需要在方法中配置) SpringBoot1.*写法 @Configura ...

  6. delphi异步选择模型编程TCP

    Server端: unit U_FrmServer; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...

  7. docker: 通过docker方式安装jenkins

    1. docker pull jenkins 2. docker run -d -p 49001:8080 -v $PWD/jenkins:/var/jenkins_home:z -t jenkins ...

  8. 淘宝后台添加颜色尺码动态sku

    废话不多说,直接上代码,用了vue,可直接copy运行 <!DOCTYPE html> <html lang="en"> <head> < ...

  9. 改动Centosserver主机名称

    1.暂时改动server主机名称: hostname myhost. myhost为你指定的主机名称. 2.永久性的改动主机名称 Centosserver安装好之后.默认的主机名为:localhost ...

  10. 【POJ 3122】 Pie (二分+贪心)

    id=3122">[POJ 3122] Pie 分f个派给n+1(n个朋友和自己)个人 要求每一个人分相同面积 但不能分到超过一个派 即最多把一整个派给某个人 问能平均分的最大面积 二 ...