jzoj1501 糖果
2018-01-26 22:02
183 查看
Description
你和你的朋友有一大包糖果,你想把这些糖按照能量尽可能平均分配,你的任务就是把这些糖分成两部分使得两部分的能量尽可能接近。Input
输入第一行包含一个整数N(1<=N<=100),示袋子中糖果的种数,接下来N行,每行两个整数K_i,C_i,K_i表示第i种糖果的数量,C_i表示每个第i种糖果所含能量大小,1<=K_i<=500,1<=C_i<=200Output
输出一个非负数,表示两部分的最小能量差。Sample Input
43 5
3 3
1 2
3 100
Sample Output
74Hint
50%的数据1<=N,K_i,C_i<=100。算法讨论
设f[i,j]为true表示分配前i个可以达到差值为j,为false则不能,那么对于第i堆糖果,在i-1堆糖果已有的分配方案中,枚举分为k个和a[i]-k个两堆,就可以在产生分配i堆糖果的方案,dp方程为:f[i,abs(j+k*b[i]-(a[i]-k)*b[i])]:=true
因为糖果能量不超过200,所以如果差值超过200,就可以在大的一堆中拿一个小于200的放入小的一堆,所以最优方案差值不超过200.var a,b:array[1..200] of longint; n,i,x,j,l:longint; begin readln(n); for i:=1 to n do begin readln(a[i],b[i]); end; for i:=1 to n-1 do for j:=i+1 to n do if b[i]<b[j] then begin l:=a[i];a[i]:=a[j];a[j]:=l; l:=b[i];b[i]:=b[j];b[j]:=l; end; for i:=1 to n do for j:=1 to a[i] do if x<=0 then x:=x+b[i] else x:=x-b[i]; writeln(abs(x)); end.
相关文章推荐
- Day 1 jzoj1501. 糖果
- [jzoj]1501. 糖果(优化多维背包的多种方法)
- 【bzoj 4548】【JZOJ 5229】 小奇的糖果
- 【JZOJ 5229】【GDOI2018模拟7.14】小奇的糖果
- 【JZOJ5229】【GDOI2018模拟7.14】小奇的糖果
- [JZOJ5229] 小奇的糖果
- HDU 1205 吃糖果
- JZOJ 3660. 【SHTSC2014】信号增幅仪
- BZOJ3052: [wc2013]糖果公园
- 前缀转后缀——jzoj 1590
- BZOJ 4338 BJOI2015 糖果
- JZOJ 2152 终极数
- 小奇的糖果(candy)
- JZOJ 3782. 【NOIP2014模拟8.17】组队
- 1501 二叉树最大宽度和高度——http://codevs.cn/problem/1501/
- jzoj3797 签到题3
- HDU 1501 Zipper 记忆化搜索
- jzoj P1331 超级教主___dp+单调队列
- NJUST 1920 偷吃糖果
- jzoj 5537. 【2014东莞市选】分组 最小割