UVA 562 Dividing coins
2015-11-18 21:45
411 查看
UVA 562 Dividing coins
传送门
题意:给你n个硬币,让你分成两堆,使得两堆的价值差最小。
分析:简单的01背包,转换一下,就是给你总价值的一半的背包空间,让你使背包里的价值尽可能大。有个小优化,就是总价值的一半都没有最大面值的硬币大时,直接就是最大面值*2-总价值。代码如下
#include<stdio.h> #include<string.h> #define mm(a) memset(a,0,sizeof(a)) #define ss(a) scanf("%d",&a) #define For(i,q,s) for(int i=q;i<=s;i++) #define For1(i,q,s) for(int i=q;i>=s;i--) int n,a[105],f[25005],t,num,maxn,ans; int main() { ss(t); while(t--) { maxn=-1; mm(f); ans=num=0; ss(n); For(i,1,n) { ss(a[i]); num+=a[i]; if(maxn<a[i])maxn=a[i]; } if((num>>1)<=maxn)printf("%d\n",(maxn<<1)-num); else { For(i,1,n) For1(j,(num>>1),a[i]) if(f[j]<f[j-a[i]]+a[i]) f[j]=f[j-a[i]]+a[i]; ans=num-(f[num>>1]<<1); printf("%d\n",ans); } } return 0; }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?