01背包。
题意是说要把一堆钱分给两个人,尽可能的平均。要求最终两人的差最小。
01背包,查看某个价值是否可能达到。能就1,不能就0.
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<vector> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define LL long long #define PI 3.141592654 #define CLR(a,b) memset(a,b,sizeof(a)) #define FOR(i,a,b) for(int i=a;i<b;i++) #define FOR_(i,a,b) for(int i=a;i>=b;i--) #define rep(i,a,b) for(int i=a ; b>a?i<b:i>=b ; b>a? i++:i--) #define pb push_back #define mp make_pair #define ft first #define sd second #define sf scanf #define pf printf #define sz(v) ((int)(v).size()) #define all(v) (v).begin(),(v).end() #define acfun std::ios::sync_with_stdio(false) #define SIZE 100 +1 using namespace std; int n,m; int c[SIZE]; bool dp[50001]; int zeroonepack(int cost) { FOR_(i,m,cost) { if(dp[i-cost]==1) dp[i]=1; } } int main() { int t; sf("%d",&t); while(t--) { sf("%d",&n); m=0; CLR(dp,0); dp[0]=1; FOR(i,0,n) { sf("%d",&c[i]); m+=c[i]; } FOR(i,0,n) zeroonepack(c[i]); // FOR(i,0,m+1) // pf("%d=%d=\n",i,dp[i]); // system("pause"); int ans=m>>1; while(dp[ans]==0)ans--; pf("%d\n",m-ans*2); } }
原文地址:http://blog.csdn.net/dongshimou/article/details/41008041