传送门     大意: 有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现.其中大理石的总数不超过20000. 解题思路: 妥妥的多重背包+二进制拆分,主要写一下二进制拆分存个档(儿时的噩梦). 总所周知,20,21,22,……2k-1从中挑选若干个相加可以得到0~2k-1中的任意数.那么将一个数s进行二进制拆分,首先要做的就是找到最大k满足2k-1<=s,设c=s-2k+1.显而易见20,21,……,2k-1,c可以从中挑选若干个数相加…
5E07 划分大理石 0x5E「动态规划」练习描述有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现.其中大理石的总数不超过20000. 输入格式有多组数据!所以可能有多行如果有0 0 0 0 0 0表示输入文件结束其余的行为6个整数 输出格式有多少行可行数据就有几行输出如果划分成功,输出Can,否则Can't 样例输入4 7 4 5 9 19 8 1 7 2 46 6 8 5 9 21 6 6 1 0 75 9 3 8 8 40 0 0…
题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件.他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有m[i]件.小FF希望在采集车不超载的前提下,选…
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20691 Accepted Submission(s): 5827 Problem Description Marsha and Bill own a collection of marbles. They want to split the collection among…
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…
突然发现这个自己还不会... 其实也不难,就和快速幂感觉很像,把物品数量二进制拆分一下,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;…
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把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="…
/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #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 $ 优化: 这个是我最先想到的,因为这道题只牵扯到了能不能买,也就是说这个背包并没有什么权值(只有"可以"和"不可以")然后就是单纯的状态转移.而这不是我们的二进制最擅长的东西吗?(我们利用某一个硬币的面额进行更新时,直接用二进制的左右移和或运算即可)…
0/1背包 给出n个物品,每个物品有Vi的价值和Wi的费用,我们总共有m块钱,求最多能得到多少价值的物品. N<=10^3,m<=10^3 记录方案数?记录输出方案? 输出方案: 对每个dp[i][j]记录是由哪个状态转移过来的,然后从最后一直往前找,输出: 最优策略方案数:再定义一个数组f[i][j]=dp[i-1][j]>dp[i-1][j-w[i]]+v[i]?f[i-1][j]:f[i-1][j-w[i]]; if(dp[i-1][j]==dp[i-1][j-w[i]]+v[i]…