UVA 10032 Tug of War
2014-11-10 12:38
405 查看
/* 注意移位的时候要转化成64位的,因为1默认为32位的 */ #include<stdio.h> #include<string> #define N 105 #define sz(v) ((int)(v).size()) #define rep(i, a, b) for (int i = (a); i < (b); ++i) #define repf(i, a, b) for (int i = (a); i <= (b); ++i) #define repd(i, a, b) for (int i = (a); i >= (b); --i) #define clr(x) memset(x,0,sizeof(x)) #define clrs( x , y ) memset(x,y,sizeof(x)) #define out(x) printf(#x" %d\n", x) #define sqr(x) ((x) * (x)) typedef __int64 ll; int n,sum; int a ; ll dp[45005]; int max(int a,int b) { return a>b?a:b; } void solve() { int i,j; int m=sum/2; clr(dp); dp[0]=1; //dp[0]为1,即0个人的时候为1 for(i=1;i<=n;i++) { for(j=m;j>=a[i];j--) { dp[j]|=dp[j-a[i]]<<1;//因为直接用值表示人数的话可能会被覆盖,所以用二进制标记 } } int post=n/2; for(j=m;j>=0;j--) { if (n%2==0 && dp[j]&((ll)1<<post) ) break; if (n%2!=0 && (dp[j]&((ll)1<<(post+1)) || dp[j]&((ll)1<<post) )) break; } printf("%d %d\n",j,sum-j); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int i; while(scanf("%d",&n)!=EOF) { sum=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } solve(); } return 0; }
相关文章推荐
- UVA - 10032 Tug of War (二进制标记+01背包)
- UVa 10032 - Tug of War
- UVA - 10032 Tug of War (二进制标记+01背包)
- UVA 10032(Tug of War)
- UVa Problem 10032 Tug of War (拔河)
- uva 10032 Problem F: Tug of War
- UVA 11292 The dragon of Loowater勇士斗恶龙 11729 突击战 Commando War
- 动态规划:POJ2576-Tug of War(二维费用的背包问题)
- POJ 2576 Tug of War 二维背包 OR 随机化
- Tug of War(严格限制数量的二维费用背包)
- ZOJ_Tug of War DP
- poj2576 Tug of War(二维费用背包)
- POJ2576 Tug of War (二维的01背包)
- POJ 2576 Tug of War(模拟退火)
- BZOJ4124 : [Baltic2015]Tug of war
- POJ 2576 Tug of War
- 【动态规划】:poj2567,Tug of War
- (挑战编程_8_5)Tug of War
- lightoj 1147 - Tug of War
- Light oj 1147 - Tug of War(状压dp)