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 ...
随机推荐
- [React] Persist Form Data in React and Formik with formik-persist
It can be incredibly frustrating to spend a few minutes filling out a form only to accidentally lose ...
- (转) SYSTEM_HANDLE_INFORMATION中ObjectTypeIndex的定义
typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO{ USHORT UniqueProcessId; USHORT CreatorBackTraceIndex ...
- Vue 开发线路 资料 汇总
线路 作者推荐学习线路 https://zhuanlan.zhihu.com/p/23134551 他人建议 https://www.cnblogs.com/smartXiang/p/6051086. ...
- JAVA设计模式之单例模式(转)
本文继续介绍23种设计模式系列之单例模式. 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单 ...
- 《python源代码剖析》笔记 Python的编译结果
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.python的运行过程 1)对python源码进行编译.产生字节码 2)将编译结果交给p ...
- 【转载】Open Live Writer 安装
Open Live Writer来源 Windows Live Writer在2012年就停止了更新,Open Live Writer是由Windows Live WriterWriter更名而来,是 ...
- jQuery源代码框架思路
開始计划时间读源代码,第一节jQuery框架阅读思路整理 (function(){ jQuery = function(){}; jQuery一些变量和函数和给jQuery对象加入一些方法和属性 ex ...
- java:BufferedImage推断图像通道顺序并转RGB/BGR
一般来说java ImageIO处理读取图像时.通常是RGB或ARGB格式,可是有的时候.我们须要图像是BGR格式. 比方通过JNI将图像矩阵传递给动态库,动态库里用OpenCV来处理矩阵,而用Ope ...
- CodeVS2492 上帝造题的七分钟2(树状数组+并查集)
传送门 树状数组模板题.注意优化,假设某个数的值已经是1了的话.那么我们以后就不用对他进行操作了,这个能够用并查集实现. 这道题还有个坑的地方,给出查询区间端点的a,b,有可能a>b. #inc ...
- 关于HTTP1.1的长连接
HTTP是一个构建在传输层的TCP协议之上的应用层的协议,在这个层的协议,是一种网络交互须要遵守的一种协议规范. HTTP1.0的短连接 HTTP 1.0规定浏览器与server仅仅保持短暂的连接.浏 ...