ACM_01背包
背包1
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量不超过 W 的物品,求所有方案中价值总和的最大值。
Input:
输入包含多组测试用例,每一例的开头为两位整数 n、W(1<=n<=10000,1<=W<=1000),接下来有 n 行,每一行有两位整数 Wi、Vi(1<=Wi<=10000,1<=Vi<=100)。
Output:
输出为一行,即所有方案中价值总和的最大值。
Sample Input:
3 4
1 2
2 5
3 7
Sample Output:
9
解题思路:简单的01背包,一维滚动数组实现,空间优化到O(W),时间复杂度仍为O(nW)。通过二维数组的计算过程中可以发现:第i件物品放与不放的结果dp[i,j]只与上一个状态的计算结果dp[i-1,j]和dp[i-1,j-wi]有关,而前面储存的信息dp[0~i-2,jor(j-wi)]再也没有用到了,那就将其舍弃,换用一维数组dp[j]来代表dp[i,j]。由二维数组状态转移方程dp[i,j]=max(dp[i-1,j],dp[i-1,j-wi]+vi)可得一维数组状态转移方程dp[j]=max(dp[j],dp[j-wi]+vi)。注意:第二重循环要逆序枚举W~w[i],这样才保证了每件物品只被拿一次,即保证了计算dp[j]时dp[j-wi]保存的是上一个状态dp[i-1,j-wi]的值,而不是当前状态dp[i][j-wi]的值,这个不难证明可以手动模拟一下。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,W,v[maxn],w[maxn],dp[maxn];//dp数组始终记录当前体积的最大价值
int main(){
while(cin>>n>>W){
for(int i=;i<n;i++)
cin>>w[i]>>v[i];
memset(dp,,sizeof(dp));
for(int i=;i<n;++i) //个数
for(int j=W;j>=w[i];--j) //01背包
dp[j]=max(dp[j],dp[j-w[i]]+v[i]); //比较放入i物体后的价值与不放之前的价值,记录大的值
cout<<dp[W]<<endl;//输出总体积的最大值
}
return ;
}
ACM_01背包的更多相关文章
- ACM_01背包2
背包4 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量不超过W的 ...
- ACM_01背包(恰好装满)
背包2 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量刚好为 W ...
- 【USACO 3.1】Stamps (完全背包)
题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
- HDU2159 二维完全背包
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- CF2.D 并查集+背包
D. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...
- UVALive 4870 Roller Coaster --01背包
题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F , D -= K 问在D小于等于一定限度的时 ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- POJ1717 Dominoes[背包DP]
Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6731 Accepted: 2234 Descript ...
随机推荐
- 跪啃SAM
struct SAM { ],size,last,pre[maxn],pos[maxn]; SAM() { size=; memset(ch[],,])); pre[]=-; } int idx(ch ...
- Max Num
Problem Description There are some students in a class, Can you help teacher find the highest studen ...
- hdu_1028_Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 创建Django项目(二)——数据库配置
2013-08-05 20:53:44| 1.数据库配置 举例是用MySQL数据库,首先在settings文件中做配置,如下: DATABASES = { ' ...
- Codeforces Educational Round 21
A =w= B qwq C wvw D(multiset) 题意: 有n(n<=1e5)个数,希望通过把一个位置y的数字放到位置x上这个操作,使得新序列的某个前缀和等于总和的一半,问这样的操作是 ...
- Flink本地安装和创建Flink应用
本篇文章首发于头条号Flink本地安装和创建Flink应用,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注 ...
- Android GIS开发系列-- 入门季(8) Json与Geometry的相互转换
在Android中json数据十分普遍,也很实用,在Arcgis中也同样支持Json数据,Json与Geometry可以相互转换,达到我们想要的数据. 一.Geometry转换成Json数据 这个实现 ...
- Check ini style config tool
INI style config is like below [section] # comment key = value Sometimes we want to check the config ...
- linux 硬件中断调节
什么是中断 中断interrupts是指硬件主动的来告诉CPU去做某些事情.比如网卡收到数据后可能主动的告诉CPU来处理自己接受到的数据,键盘有了按键输入后会主动告知CPU来读取输入. 硬件主动的打扰 ...
- mysql导入大型sql文件时注意事项
原文:http://blog.csdn.net/k21325/article/details/70808563 大型sql文件,需要在my.ini(windows)或者my.cnf(Linux)中设置 ...