题目链接: F. PolandBall and Gifts time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output It's Christmas time! PolandBall and his friends will be giving themselves gifts. There are n Balls overall.…
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…
[题目链接]:http://codeforces.com/contest/755/problem/F [题意] n个人; 计划是每个人都拿一个礼物来送给一个除了自己之外的人; 且如果一个人没有送出礼物,那么它和它送礼物的对象都得不到礼物; 但是已经知道有k个人会忘记带礼物来; 问最少有几个人收不到礼物,最多有多少个人收不到礼物 [题解] ① 对于最多的情况; 最后会形成多个环; 每个环隔一个人选一个人忘记带礼物;这样一个长度为len的环只要len/2个人没带礼物就能够整个环的人都收不到礼物了;…
POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num[i].另一个限制条件,这个积木所在的位置不能高于limit[i],问能叠起的最大高度? 分析: 本题是一道多重背包问题, 只是每一个物品的选择不只要受该种物品的数量num[i]限制, 且该物品还受到limit[i]的限制. 这里有一个贪心的结论: 我们每次背包选取物品时都应该优先放置当前limit…
洛谷题面传送门 & Atcoder 题面传送门 由于再过 1h 就是 NOI 笔试了所以题解写得会略有点简略. 考虑差分,记 \(b_i=c_i-c_{fa_i}\),那么根据题意有 \(b_i\le d,i=2,3,4,\cdots,n\),而 \(b_1\) 则没有任何约束条件.而如果我们令某个 \(b_i\) 加 \(1\),其余 \(b_i\) 均不变,那对应到原 \(c\) 序列上的操作效果就是 \(i\) 子树内的 \(c_j\) 加 \(1\),其余 \(c_j\) 不变,因此预处…
https://cn.vjudge.net/problem/615831/origin 题意 n个人;  计划是每个人都拿一个礼物来送给一个除了自己之外的人;  如果一个人没有送出礼物,那么它和它送礼物的对象都得不到礼物;  但是已经知道有k个人会忘记带礼物来;  问最少有几个人收不到礼物,最多有多少个人收不到礼物 既然是求点和点之间的关系,首先会想到建图,建完图发现事实上图是一个个环状联通快组成的,我们首先对最大值最小值分开进行讨论 最大值:当环是偶数的时候,一个人不送礼物可以提供2个贡献,形…
Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11596    Accepted Submission(s): 4634 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One…
PolandBall and Gifts 转换成置换群后, 对于最大值我们很好处理. 对于最小值, 只跟若干个圈能否刚好组能 k 有关. 最直观的想法就是bitset优化背包, 直接搞肯定T掉. 我们能再发掘一些性质, 就是本质不能的圈的大小最多有sqrt(n)个, 因为1 + 2 + 3 ... + n = (n + 1) * n / 2 所以对于每个不同的数二进制优化一下就可以过啦. 感觉这种题就很有意思.. #include<bits/stdc++.h> #define LL long…
题目链接:http://codeforces.com/problemset/problem/106/C 根据题意列出式子,设每种蛋糕做了xi个,则对于每种材料bi*xi<=ai. 对于dough,有sum(ci*xi) + c0*x0 <=n. 要使得sum(di*xi)+d0*x0最大,立即转化为多重背包,有xi<=ai/bi.这是物品i的数量限制,背包的容量为n,每件物品的体积为ci,价值为di.由于数据比较弱,就算直接拆分成0-1背包都可以做.. 贴代码: #include<…
https://codeforces.com/contest/1132/problem/E 题意 有8种物品,重量是1~8,每种数量是\(cnt[i]\)(1e16),问容量为W(1e18)的背包最多能装多少重量 题解1 多重背包二进制拆分物品转换成01背包,用map来剪枝掉无用的状态 #include<bits/stdc++.h> #define ll long long using namespace std; map<ll,bool>f,g; ll a[10],W,s[100…
Vjudge传送门 $Sol$ 首先发现这是一个多重背包,所以可以用多重背包的一般解法(直接拆分法,二进制拆分法...) 但事实是会TLE,只能另寻出路 本题仅关注“可行性”(面值能否拼成)而不是“最优性”,这是一个特殊之处. 从这里找优化 在“最优性”的问题中,$f[j]$从$f[j]$或$f[j-a[i]]$中转移而来:而在这样的“可行性”问题中,其实只要$f[j]$可行,我们就可以不用考虑$f[j-a[i]$了,也可以反过来说. 于是我们可以考虑一种贪心策略,设$used[j]$表示$f[…
题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 1000 + 10; int G[MAX_N][MAX_N]; struct…
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则,假如u在v相邻前面,那么u和v可以交换位置,问你是队列最后一个人的时候你最前可以换到前面哪里 题解 因为相邻才能换,所以最后一个换到前面一定是一步一步向前走,所以不存在还要向后走的情况 设最后一个为u,假设前面有一个能和u换位置的集合,那么需要将这些点尽量往后移动去接u 假设前面有一个不能和u换位置的集合S,…
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \(n\) 序列 \(A\),和 \(q\) 次询问,对于每一次询问给出两个数 \(l, x\) ,你需要计算在前缀和 \(A[1, l]\) 中选取若干个数,使得它们 \(xor\) 起来的结果等于 \(x\) 的方案数 $n , q \leq 10^5   0 \leq A_i \leq 2^{20} $…
\(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗树,并最小化删掉环边后的树的直径. \(n \leq 2 \times 10^5\) 树的边权 $ \leq 10^9 $ 解题思路 : 考虑最终树的直径可能由两部分组成,答案是其中的最大值 第一种就是外向树内的直径的最大值,这个只需要随便\(dp\)一下即可,这里不过多讨论 第二种情况树的直径经过原来的环,…
Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和,用于之后快速求和.将原数组排序后去重,枚举每一个数做lead的情况下,其余数减少后再求和的结果.不断维护最大值即可. PS:这里用到了一个方便的函数unique()来去重,使用前需要先将数组排序,参数为数组的首地址和尾后地址,返回新的尾后地址.(该函数没有将重复的元素删除,只是放到了尾地址后面)可…
http://poj.org/problem?id=3260 这个题目有点小难,我开始没什么头绪,感觉很乱. 后来看了题解,感觉豁然开朗. 题目大意:就是这个人去买东西,东西的价格是T,这个人拥有的纸币和数量.让你求这个人买东西的纸币量加上老板找给他的纸币量最少是多少. 这个老板用于这个人拥有的纸币种类,数量是无限. 思路: 思路就是这个人看成多重背包,老板看成完全背包,f1[i] 表示这个人花了 i 的钱用的最少的纸币.f2[i] 表示老板凑出 i 的钱用的最少的纸币. #include <c…
pro:给定N个点,M条边,现在你要给一些连通块加边,使得至少存在一个连通块的大小是由4和7组成的数字.问至少加边数量. sol: 看似一个很难的题目.  首先不要想太难了,还是应该想能不能用背包做. 我们把块的大小相同的分到一组,就可以分组背包了. 然后注意到组别的大小其实不会太大,因为1*1+2*2+3*3+4*4+x*x<=1e5;   x是1e2级别的. 所以做100次多重背包. 总的复杂度也才O(100*N*K),K是个比较小的常数,真正的复杂度小于这个: #include<bits…
首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 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的范围内 但是这种…
写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下  01背包 大家先看一下这道01背包的问题  题目  有m件物品和一个容量为n的背包.第i件物品的大小是w[i],价值是k[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.    题目分析:我们刚刚看到这个题目时,有的人可能会第一想到贪心,但是经过实际操作后你会很~~神奇~~的发现,贪心并不能很好的解决这道题(没错,本蒟蒻就是这么错出来的)…
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能获得尽量多的收益呢?作为一名大神犇,他轻而易举的解决了这个问题. 然而,就在他出发前,他又收到了一批奇货.这些货共有m件,第i件的价值Yi与分配的体积Xi之间的关系为:Yi=ai*Xi^2+bi*Xi+ci.这是件好事,但小S却不知道怎么处理了,于是他找到了一位超级神犇(也就是你),请你帮他解决这个…
Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 34814   Accepted: 11828 Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some…
Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32971   Accepted: 11950 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…
题目: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…
题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可以有0-n件. 对于第i种物品,我们有取0件,1件…n [ i ] 件共n [ i ] +1种策略,状态转移方程为f [ i ] [ v ] = max { f [ i - 1 ] [ v - k × c [ i ] ] + k × w [ i ] | 0 <=k<= n [ i ] }.在这里,…
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况. 输入 一行,包括六个正整数a1,a2,a3,a4,a5,a6,表示1g砝码有a1个,2g砝码有a2个,--,20g砝码有a…
解题思路: 多重背包:第 i 件物品有 j 个可用. 本题中 第 p[i] 类大米 有 c[i] 袋大米可买 ,故本题为多重背包. n(总钱数).m(种类) p[i] 单价 h[i] 重量 c[i] 本种类的总袋数 01背包解题伪代码: for i=1-m  //种类 for j=1-c[i]  //每种的最大袋数 for k=n-p[i] //总钱数-当前种类的单价 f[k]=min{f[k],f[k-p[i]]+h[i]} #include<bits/stdc++.h> using nam…
//Accepted 868 KB 188 ms //多重背包 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持…
//Accepted 624 KB 16 ms //dp 背包 多重背包 #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; int f[imax_n]; ]; int v; ; int max(int a,int b) { return a>b?a:b; } void zeroOnePack(int cost,int weight) { for (int…
本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01背包解.多重背包转化为01背包的关键在于把件数从整体中孤立出来作为一个新的个体,也就是说不管分类,有多少件就有多少种. AC代码: //============================================================================ // Na…