hdu 1171 Big Event in HDU 【母函式】
阿新 • • 發佈:2018-12-07
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1171
題意:航電計算機學院要分成軟體學院和計算機學院,要分物資,計算機學院的物資不少於比軟體學院的(儘可能平均的請款下)
思路:母函式做一發,基本套模板,記錄一下數量和價值還有總價值即可
#include<stdio.h> #include<string.h> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N=3e6+10; const int M=1e3+10; int c1[N],c2[N]; //c1存每種及價值的組合數 //c2是中間量 int sum[M];//總價值 int num[M];//每種物品的數量 int val[M];//每種物品的價值 int main() { int n; while(~scanf("%d",&n)) { if(n<=0) break; memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { scanf("%d %d",&val[i],&num[i]); sum[i]=sum[i-1]+num[i]*val[i]; } for(int i=0;i<=num[1];i++)//首先初始化第一個表示式 c1[i*val[1]]=1; for(int i=2;i<=n;i++)//i表示得到前面表示式與第i個表示式 { for(int j=0;j<=sum[i-1];j++)//前面表示式的每一項 { for(int k=0;k<=num[i]*val[i];k+=val[i])//當前表示式的每一項 { c2[k+j]+=c1[j]; } } for(int j=0;j<=sum[i];j++) { c1[j]=c2[j]; c2[j]=0; } } int mid=sum[n]/2; int a,b; for(int i=mid;i>=0;i--) { if(c1[i]!=0) { b=i; break; } } a=sum[n]-b; printf("%d %d\n",a,b); } return 0; }