HDU1059 二进制拆分优化多重背包】的更多相关文章

/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ],vr[],dp[]; ],v[]; int numw; void cf(int n,int ok) { int i,j,sum,e; e=sum=; whil…
\(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. $bitset $ 优化: 这个是我最先想到的,因为这道题只牵扯到了能不能买,也就是说这个背包并没有什么权值(只有"可以"和"不可以")然后就是单纯的状态转移.而这不是我们的二进制最擅长的东西吗?(我们利用某一个硬币的面额进行更新时,直接用二进制的左右移和或运算即可)…
(人生第一篇bzoj题解有点激动 首先介绍一下题目: 看它题目那么长,其实意思就是给定一个数a,求将其拆分成n个数,通过这n个数可以表示出1~a中所有数的方案中,求最小的n. 您看懂了嘛?不懂咱来举个栗子: 3可以变为(1,2)两个数(废话,我当然知道),使1,2可以表示出1,2,3这些数字.看到这道题就想到了不久前看到的二进制优化多重背包.简直一模一样. 我们想我们对于一个数P.我们可以将其分成两部分(1~P/2)与(P/2+1,P),我们思考:假设我们已经知道(1~P/2)至少需要m个数,那…
Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53029   Accepted: 13506 Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbl…
思路: 讲道理我应该写单调队列优化多重背包的 但是我不会啊 但是我现在! 还不会啊 我就写了个二进制优化的.. 过了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ],b[],c[],f[],jy,xx,top,k; int main(){ scanf("%d",&n); ;i<=n;i++)sc…
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 题解:怎么用二进制优化多重背包,举一个例子就明白了. 如果要放n个苹果,可以将n个苹果分成几个2的次方1,2,3,4,m^2然后n可以由这些按照某种组合来组合. 于是就知道怎么优化了. #include <iostream> #include <cstring> #include <cstdio> using namespac…
题意:直接说数据,735是目标值,然后3是后面有三种钱币,四张125的,六张五块的和三张350的. 思路:能够轻易的看出这是一个多重背包问题,735是背包的容量,那些钱币是物品,而且有一定的数量,是多种背包.但是做的时候总是超时.可能是因为m和n太大.然后可以通过二进制把它转化为01背包,因为将钱币的数量化为二进制,1   2    4直到数量减一.化成的二进制数字排列组合,可以组成任意钱币数量内的数字. 看代码: //二进制优化 多重背包转化为01背包 #include<stdio.h> i…
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role="presentation" style="position: relative;">20,21,...2t,c[i]−2t+1+120,21,...2t,c[i]−2t+1+1的组合. 这样物品总个数就变成了∑log(c[i])" role="…
2120 : 安详 题目描述 spring最近喜欢上了B站新秀主播,身为顿顿吃黄焖鸡的土豪,当然要过去打赏一番,但是spring还是喜欢精打细算,所以在打赏的时候,想要掏出有限的钱,获得主播的最大好感. 主播的好感值是通过送不同的礼物而提升不同,不同礼物的赠送,可以增加的好感值也是不同的,当然礼物的价格更是不同. 输入 输入第一行为两个整数n,m.分别表示有n种不同礼物(1e2)和总金钱数m(1e6),以下n行每行有三个数字,分别表示该礼物的个数(int)和价格(int)以及好感值(int).…
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc)\). 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstring> #include<algorithm> #inc…
突然发现这个自己还不会... 其实也不难,就和快速幂感觉很像,把物品数量二进制拆分一下,01背包即可 我是咸鱼 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[7],ave,sum; bool f[120005]; void bag01(int w) { for(int j=ave; j>=w; j--) if(f[j-w]) f[j]=1;…
4182: Shopping Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 374  Solved: 130[Submit][Status][Discuss] Description 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树的形状. 第i个商店只卖第i种物品,小苗对于这种物品的喜爱度是wi,物品的价格为ci,物品的库存是di.但是商店街有一项奇怪的规定:如果在商店u,v买…
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1,m]内多少价值(换句话说,就是可以恰好支付的价格有多少) 解题思路 一开始觉得这个题也不是很难,就是多重背包问题,但是用二进制优化的多重背包写法TLE后,陷入了深思... 看了数据范围,二进制优化的时间复杂度为O(∑ log(num[i]  * V),加上多组输入后....应该是没被冤枉了....…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:多重背包 分析:f[i][j]=max(f[i-1][j-k*w[i]]+k*v[i]) 将j写成w[i]的余数形式 即j=a*w[i]+b 则f[i][j]=max(f[i-1][(a-k)*w[i]+b]-(a-k)*v[i])+a*v[i] 其中0<=k<=min(num[i],j/w[i]) 再将a-k换成k 则f[i][j]=max(f[i-1][(k*w[i]+b]-k*v[i…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4182 题解 有一个很直观的想法是设 \(dp[x][i]\) 表示在以 \(x\) 为根的子树中选择一个总花费不超过 \(i\) 的以 \(x\) 为根的连通块的最大收益. 可惜,很不幸的是,这样做的时间复杂度无法像一般的树上背包和序列背包一样被保证.能够被保证复杂度的方法只有(可能是我只会)第二维与子树大小有关的方法,或者是将树转化成 dfs 序,然后在序列上做背包. 第二种方法具体的来说…
Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38986   Accepted: 14186 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The m…
PolandBall and Gifts 转换成置换群后, 对于最大值我们很好处理. 对于最小值, 只跟若干个圈能否刚好组能 k 有关. 最直观的想法就是bitset优化背包, 直接搞肯定T掉. 我们能再发掘一些性质, 就是本质不能的圈的大小最多有sqrt(n)个, 因为1 + 2 + 3 ... + n = (n + 1) * n / 2 所以对于每个不同的数二进制优化一下就可以过啦. 感觉这种题就很有意思.. #include<bits/stdc++.h> #define LL long…
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int T,A[10]; bool f[100010]; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&…
题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买. 请问:你用有限的资金最多能采购多少公斤粮食呢? 后记: 人生是一个充满了变数的生命过程,天灾.人祸.病痛是我们生命历程中不可预知的威胁. 月有阴晴圆缺,人有旦夕祸福,未来对于我们而言是一个未知数.那么,我们要做的就应该是珍惜现在,感恩生活-…
<题目连接> 题目大意: 一位同学想要买手表,他有n种硬币,每种硬币已知有num[i]个.已知手表的价钱最多m元,问她用这些钱能够凑出多少种价格来买手表. 解题分析: 很明显,这是一道多重背包的问题,下面是用二进制拆分的多重背包的万能模板. #include <bits/stdc++.h> using namespace std; const int INF = 1e9; ],cnt[],dp[)]; void OneZeroPack(int m,int v,int value){…
写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下  01背包 大家先看一下这道01背包的问题  题目  有m件物品和一个容量为n的背包.第i件物品的大小是w[i],价值是k[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.    题目分析:我们刚刚看到这个题目时,有的人可能会第一想到贪心,但是经过实际操作后你会很~~神奇~~的发现,贪心并不能很好的解决这道题(没错,本蒟蒻就是这么错出来的)…
使用一种二进制的优化, 可以完美的解决这题,<背包九讲>中说的非常好 但是还有一种线性复杂的算法. 应该算是该题很巧妙的解法 ;i++) { ;l--) { ) continue; ;k<=num[i]&&k*i+l<=total;k++) { if(dp[k*i+l]) break; // 这个剪枝瞬间将复杂度从N^2变成了N. dp[k*i+l]=; } } } 代码中total是我们要装满的容量, 循环的次序很重要. 当关键还是那一步剪枝 在附上一份用二进制优…
题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分优化下........ #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[200000],w[200000]; int main() { int t[7],…
首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ;k<=C[i];k++) ;j>=;j--) ) F[j]=min(F[j],F[j-V[i]]+); 很简单 很好懂 但是这样做导致时间复杂度为O(N*C*T) 这道题来看超时到爆炸 那么我们考虑两种方法 第一种是像wph写的 首先贪心一会儿 然后再背包 答案大概在T到2*T的范围内 但是这种…
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn.net/flyinghearts/article/details/5898183 传送门:hdu 3401 Trade /************************************************************** Problem:hdu 3401 Trade Us…
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=1014">http://poj.org/problem?id=1014 Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. Th…
BZOJ 题目的限制即:给定一棵树,只能任选一个连通块然后做背包,且每个点上的物品至少取一个.求花费为\(m\)时最大价值. 令\(f[i][j]\)表示在点\(i\),已用体积为\(j\)的最大价值. 如果物品数量为\(1\),那就是一个树形依赖背包(选儿子必须选父亲),用DFS序优化转移:\(f[i][j]=\max(f[i+1][j-v_i]+w_i,\ f[i+sz_i][j])\)(选该节点就可以从上一个点,即子树内转移,否则只能从另一棵子树转移),复杂度\(O(nm)\). 物品数量…
1531: [POI2005]Bank notes Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 521  Solved: 285[Submit][Status][Discuss] Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. Input 第一行一个数 n,…
F. PolandBall and Gifts   It's Christmas time! PolandBall and his friends will be giving themselves gifts. There are n Balls overall. Each Ball has someone for whom he should bring a present according to some permutation p, pi ≠ i for all i. Unfortun…
传送门 解题思路 二进制优化多重背包裸题. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; const int MAXN = 120005; inline int rd(){ int x=0,f=1;char ch=getc…