标签:母函数
2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40题意: n个工厂,然后n行每行两个数代表工厂的价值和数量。尽量将工厂总价值平分为两份,保证 A>=B母函数解:设 half=总价值/2 ,跑一遍母函数生成a[]数组,然后判a[half]是否为0,不为0说明可以平分。。否则就一直从half+1往后扫坑爹之处是 不能用n!=-1来跳出循环。。n>=0可过#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cctype> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> #include <list> #define maxn 250010 #define ll long long #define INF 0x3f3f3f3f #define pp pair<int,int> using namespace std; int a[maxn],b[maxn],v[55],p,num[55],n,half; void solve() { memset(a,0,sizeof(a)); a[0]=1; for(int i=0;i<n;i++) { memset(b,0,sizeof(b)); for(int j=0;j<=num[i]&&j*v[i]<=p;j++) for(int k=0;k+j*v[i]<=p;k++) b[k+j*v[i]]+=a[k]; memcpy(a,b,sizeof(b)); } half=p/2; if(a[half]) printf("%d %d\n",p-half,half); else { for(int i=half+1;i<=p;i++) if(a[i]) { printf("%d %d\n",i,p-i); return ; } } } int main() { while(~scanf("%d",&n)&&n>=0) { p=0; for(int i=0;i<n;i++) { scanf("%d%d",&v[i],&num[i]); p+=v[i]*num[i]; } solve(); } return 0; }
HDU 1171-Big Event in HDU(母函数)
标签:母函数
原文地址:http://blog.csdn.net/qq_16255321/article/details/41022687