POJ 1742 Coins ( 单调队列解法 )
id=1742" target="_blank">题目链接~~>
做题感悟:第一次做的时候用的二进制优化。可是没注意到是险过。so也没去看单调队列的解法。
解题思路:
假设你做过单调队列的题,或者看过相关的博客就好理解这题了。博客。
再加上这题体积与价值相等那么就更好做了。仅仅有 j %v[ i ] 余数同样的才干够同一时候处理(j 指的是某个体积的值),在计算某个数的时候,仅仅要计算前面的同样的余数中(在个数限制内)是否有
true(有放满的) 就能够了。
代码:
- #include<iostream>
- #include<sstream>
- #include<map>
- #include<cmath>
- #include<fstream>
- #include<queue>
- #include<vector>
- #include<sstream>
- #include<cstring>
- #include<cstdio>
- #include<stack>
- #include<bitset>
- #include<ctime>
- #include<string>
- #include<cctype>
- #include<iomanip>
- #include<algorithm>
- using namespace std ;
- #define INT long long int
- #define L(x) (x * 2)
- #define R(x) (x * 2 + 1)
- const int INF = 0x3f3f3f3f ;
- const double esp = 0.0000000001 ;
- const double PI = acos(-1.0) ;
- const int mod = 1000000007 ;
- const int MY = (1<<5) + 5 ;
- const int MX = 100010 + 5 ;
- int n ,W ,ans ;
- int v[MX] ,num[MX] ;
- bool deq[MX] ,dp[MX] ;
- void input()
- {
- memset(dp ,false ,sizeof(dp)) ;
- for(int i = 1 ;i <= n ; ++i)
- scanf("%d" ,&v[i]) ;
- for(int i = 1 ;i <= n ; ++i)
- scanf("%d" ,&num[i]) ;
- }
- void DP(int v ,int num)
- {
- if(!num || !v) return ;
- if(num == 1) // 01 背包
- {
- for(int i = W ;i >= v ; --i)
- if(!dp[i] && dp[i-v])
- dp[i] = true ,ans++ ;
- }
- else if(num * v >= W) // 全然背包
- {
- for(int i = v ;i <= W ; ++i)
- if(!dp[i] && dp[i-v])
- dp[i] = true ,ans++ ;
- }
- else
- {
- num = min(num ,W/v) ;
- for(int a = 0 ;a < v ; ++a) // 同样余数一块处理
- {
- int front =0 ,end = 0 ,sum = 0 ;
- for(int j = a ;j <= W ; j += v)
- {
- if(end - front-1 == num) // 去除过时元素 ,由于最多选择num[i] 个
- sum -= deq[front++] ;
- deq[end++] = dp[j] ; // 存入
- sum += dp[j] ;
- if(!dp[j] && sum)
- dp[j] = true ,ans++ ;
- }
- }
- }
- }
- int main()
- {
- //freopen("input.txt" ,"r" ,stdin) ;
- while(scanf("%d%d" ,&n ,&W) ,n+W)
- {
- input() ;
- dp[0] = true ;
- ans = 0 ;
- for(int i = 1 ;i <= n ; ++i)
- DP(v[i] ,num[i]) ;
- printf("%d\n" ,ans) ;
- }
- return 0 ;
- }
POJ 1742 Coins ( 单调队列解法 )的更多相关文章
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
- POJ 1742 Coins(多重背包, 单调队列)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- poj 1742 Coins (多重背包)
http://poj.org/problem?id=1742 n个硬币,面值分别是A1...An,对应的数量分别是C1....Cn.用这些硬币组合起来能得到多少种面值不超过m的方案. 多重背包,不过这 ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- POJ 3017 DP + 单调队列 + 堆
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...
- POJ 1742 Coins(多重背包,优化)
<挑战程序设计竞赛>上DP的一道习题. 很裸的多重背包.下面对比一下方法,倍增,优化定义,单调队列. 一开始我写的倍增,把C[i]分解成小于C[i]的2^x和一个余数r. dp[i][j] ...
- POJ 2823【单调队列】
题意: 给出序列,找出每个连续长度为k的子序列的最大值和最小值. 思路: 裸单调队列... 单调队列这东西用的真的非常局限,大概只能用到这种情景中== 简单说一下维护: 添加元素,为了保持单调性,排除 ...
随机推荐
- Netduino开篇
很久没写博客了,最近看到一些朋友,如一直在做micro framework的叶帆,如成都智能盒子公司的奈何他们一直在为物联网做着技术推广工作.为了及时向他们学习,俺也写写一些博客,做一下简单的技术推广 ...
- [Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现
各位朋友,大家晚上好, 我是秦元培.欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.今天我们来做一个高端大气上档次的东西. 我相信大家都玩过一款叫做<愤慨的 ...
- 初识Dubbo 系列之4-Dubbo 依赖
依赖 必需依赖 JDK1.5+ 理论上Dubbo能够仅仅依赖JDK,不依赖于不论什么三方库执行,仅仅需配置使用JDK相关实现策略. 缺省依赖 通过mvn dependency:tree > de ...
- HTTP数据包头解析(简单清楚)
[转]HTTP请求模型和头信息参考 参考: http://blog.csdn.net/baggio785/archive/2006/04/13/661410.aspx模型: http://blog.c ...
- spring boot application properties配置详解
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- Scanner类及正则表达式
import java.util.Scanner; public class ScannerToString { public static void main(String[] args) { Sc ...
- Android——与查询联系人相关的3张表
- POJ 3619 Speed Reading(简单题)
[题意简述]:有K头牛,N页书,每次第i头牛每分钟仅仅能读Si页书,连续读Ti分钟,之后歇息Ri分钟.如今问我们第i头牛花费多少时间能够读完这N页书. [分析]:简单的模拟 //220K 32Ms # ...
- phabricator在mac上的搭建(转)
环境:OS X Yosemite 10.10.5 前提:phabricator主要是由php写的,而且是以website方式运行的,所以mac上要先安装好 php + nginx(或apache) + ...
- hdu1392 Surround the Trees 凸包
第一次做凸包,这道题要特殊考虑下,n=2时的情况,要除以二才行. 我是从最左边的点出发,每次取斜率最大的点,一直到最右边的点. 然后从最左边的点出发,每次取斜率最低的点,一直到最右边的点. #incl ...