lightoj1200 【完全背包】
题意:
有一个能放W重的袋子,然后妻子给了老公一列清单,每个item会有价格,数量,重量。
首先得满足老婆的要求,然后在可装的地方输出最大还能拿多少使得拿的东西的钱最多。
注意标题是thief,我想大家也能知道基本上出背包题的人都是心机biao啊…)逃
思路:
1.首先要满足wife的要求是不是。
2.其次再满足husband的小心思。
后面就转化成了完全背包。
一开始类似0/1背包直接那个超时转化交了一发,肯定T。。
)然后贴了一发完全背包模板就过了。。。
——然后去看了百度百科的完全背包(没错就是百度百科),摘了几句下来
完全背包与01背包的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?
因为要保证第i次循环中的状态dp[ j ]是由状态dp[ j-w[ i ] ]递推而来。
换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个没有已经选入第i件物品的子结果dp[ j - w[ i ] ]。
比如当你在算dp[ j(>2*w[i]) ] 的时候,其实你的dp[j-w[i]]在前面已经更新了,所以采用一维数组直接可以办到,而且每次更新的复杂度是O(W),总的来说就是O(nW);
这也是最优解法吧。
不过百度百科上还有一个优化没怎么看懂。
原文:
更高效的转化方法是:把第i种物品拆成费用为c*2^k、价值为w*2^k的若干件物品,其中k满足0<=k<=log2(V/c)+1。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log2(V/c))件物品,是一个很大的改进。
wonter巨:因为一个数总能分成若干个2^i相加之和啊。
也许这样可以若有所思~
code…
#include<bits/stdc++.h>
//#include<cstdio>
//#include<math.h>
//#include<string.h>
//#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-5;
const double pi=acos(-1.0);
const int mod=1e8+7;
const LL INF=0x3f3f3f3f;
const int N=1e2+10;
int val[N],dw[N];
int dp[N*N];
int main()
{
int cas=1;
int n,w;
int t,x,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&w);
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&val[i],&x,&dw[i]);
sum+=x*dw[i];
}
w-=sum;
if(w<0){
printf("Case %d: Impossible\n",cas++);
continue;
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=dw[i];j<=w;j++){
dp[j]=max(dp[j],dp[j-dw[i]]+val[i]);
}
}
printf("Case %d: %d\n",cas++,dp[w]);
}
return 0;
}
lightoj1200 【完全背包】的更多相关文章
- 【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 ...
- HDU3466 Proud Merchants[背包DP 条件限制]
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
- POJ1112 Team Them Up![二分图染色 补图 01背包]
Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ...
随机推荐
- Unity3d插件]EasyTouch简单使用方法
EasyTouch使用 EasyTouch 文件夹[-] 一.效果图 二.操作步骤 1.官方文档上的步骤 2.翻译一下以上的步骤 3.依据官方的这些提示.自己来做一个属于自己的人物遥感控制 对于移动平 ...
- IP协议解读(二)
IP协议是TCP协议栈中的核心协议,也是网络编程的基础之中的一个. 我们接着在IP协议解读(一)继续学习 网络层作用 IP分片: IP数据报的长度超过帧的MTU时,将会被分片传输. 分片可能发生在发送 ...
- app具体介绍界面-01
在我们的上一篇博客中,我们介绍了首页中的app列表界面怎样完毕.这个ListView以及其Adapter会在我们后面的界面中重用,所以这个是比較重要的,在这一篇博客中,我们先完毕app具体介绍界面的一 ...
- PHP读取excel(5)
如果数据量很大的时候,就需要用PHPExcel迭代器逐行读取,具体代码如下: <?php header("Content-Type:text/html;charset=utf-8&qu ...
- eclipse svn org.tigris.subversion.javahl.ClientException: RA layer request failed
突然之间eclipse使用svn更新项目时报错,org.tigris.subversion.javahl.ClientException: RA layer request failed 网上搜的都是 ...
- redis中关于过期键的删除策略
我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中.由Redisserver来维护和管理这部分内存,内存是何足珍贵,不须要的数据或者是已经使用过的无 ...
- 阿里云安装nginx 启动失败的原因。
阿里云编译安装nginx服务器后启动一直报下面错误. 百度了一圈,看到一个说要先关掉apache服务,感觉这个好像是对的,立马做了下面操作. 果然把nginx起了起来. 从这边才知道apache和ng ...
- Json的简单介绍和解析
Json:JavaScript对象表示法(JavaScript Object Noatation) Json是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅读和编写,同时也 ...
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- RDLC后台自己定义报表模板
首先封装一个公共类,统一来操作RDLC报表 using System; using System.Collections.Generic; using System.Linq; using Syste ...