HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数.因此用0表示不可以,1表示可以.最后对dp数组扫描一遍即可. 代码总览 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define nmax 100…
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那么肯定不能被平分.若为偶数,则对valuesum/2为背包容量,全体石头为商品做完全背包.把完全背包进行二进制优化后,转为01背包即可. 代码总览 #include <iostream> #include <cstdio> #include <cstring> #inclu…
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的价格,重量和袋数. 每种大米的数量是有限的,应该能看出是多重背包的问题.关键是多重背包的处理方法.对多重背包采用二进制优化的方法.设同种大米的数量为n,每袋的价格为v,那么把同一种大米分别拆成1,2,4,8,16--(直到不够2^n时,剩下的单独分成一组),拆分的价格也分别对应是v,2v,4v,8v…
hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听过```不得不吐槽自己的知识面太窄```于是,我用了母函数写这题,母函数的做法并没有问题,但是由于这道题的数据很大,母函数轻轻松松就超时了,于是,我又很努力地在母函数循环的优化上面想出路,改改改,各种改之后依旧TLE,01背包的做法显然也是会超时的,DISCUSS里的母函数做法优化方式都是模上一个大…
题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加, 让我算可以累加得到的数的种数! 解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数是可以得到的!一个循环计算可以达到的数的个数,最后输出就好了! #include<stdio.h> #define max(a,b) a>b?a:b int bb[500000]; int vv; void shun(int cost,int weight) { int i; for(i=c…
<题目连接> 题目大意: 一位同学想要买手表,他有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){…
点我看题目 题意 :Whuacmers有n种硬币,分别是面值为A1,A2,.....,An,每一种面值的硬币的数量分别是C1,C2,......,Cn,Whuacmers想买钱包,但是想给人家刚好的钱,不喜欢再找钱那么麻烦,但是他不知道钱包的具体钱数,只知道不会超过m,所以问你手里的钱能表示多少个不超过m的钱数. 思路 :多重背包.不知道的去搜背包九讲,几乎都一样. 我想说这个小哥儿真逗 #include <stdio.h> #include <string.h> #include…
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(witho…
BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\(x,y\),\(x\)子树所有边全指向\(a\),\(a\)与\(y\)子树之间的边全指向\(y\).这样答案就是\(sz[x]\times sz[y]\),要让\(sz[x],sz[y]\)尽量相等.找重心就好了. 然后DP,求划分重心两部分子树大小分别为\(x\)和\(n-1-x\)是否可行.…
题目链接:https://vjudge.net/contest/228640#problem/F 转载于:http://www.voidcn.com/article/p-mxcorksq-gh.html 题目大意: 给定N种钱,每种面值Ai,数量Ci,问可凑出的总价值中有多少种在(0,M]范围之间 #include <iostream> #include <cstring> #include <algorithm> using namespace std; ], c[]…