hdu2110(母函式)
阿新 • • 發佈:2019-02-07
Crisis of HDU
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2909 Accepted Submission(s): 803
Problem Description 話說上回講到HDU大戰東洋小苟,結果自然是中方大勝,這一戰也使得海東集團在全球同行業中的地位更加鞏固。隨著集團的發展,很多創業時期的元老逐步功成身退,先是8600移民海外,然後是linle夫婦退隱山林,逐漸的,最初眾多的元老只剩下XHD夫婦和Wiskey三人了。
到了2020年,因為擴張過度加上老鼠數量逐年減少,公司的發展遇到了前所未有的危機,此時集團已經沒有任何流動資金,更可怕的是,這個時候,wiskey也決定退出了!
退出本身並不麻煩,麻煩的是,退出的人需要取走相應比例(1/3)金額的資產。
假設公司此時一共有n種價值的資產,每種價值的資產數量已知,請幫助心煩意亂的XHD夫婦計算一共有多少種分割資產的方法。
Input 輸入包含多個測試例項,每個例項的第一行是一個整數n(n<100),表示一共有n種價值的資產,接著的n行每行包含兩個整數pi和mi(0<pi,mi<10),分別表示某種價值和對應的數量,n為0的時候結束輸入。
Output 對於每個測試例項,請輸出分割資產的方案數%10000,如果不能分割,請輸出“sorry”,每個例項的輸出佔一行。
Sample Input 2 1 1 2 1 0
Sample Output 1 面對朋友的退出和資金短缺,海東集團能度過難關嗎?作為老總的XHD如何來化解這場危機?欲知後事如何,且聽下回分解——
Author lcy
Source 此題要求能否把所有的資產平均分成3部分。可以首先判斷總資產sum%3是否為0,若不為0則肯定不能平均分成3分;若為0還需繼續判斷,判斷3的組合數是否不為0.若不為0則可以平均分成3分;若為0不能平均分成3分。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; int n,sum; int num[100+10],value[100+10]; int a[10000+100]; int b[10000+100]; void Generating_function() { int i,j,k; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); a[0]=1; for(i=1;i<=n;i++) { for(j=0;j<=sum;j++) { for(k=0;k<=num[i]&&k*value[i]+j<=sum;k++) { b[k*value[i]+j]+=a[j]; b[k*value[i]+j]%=10000; } } memcpy(a,b,sizeof(b)); memset(b,0,sizeof(b)); } } int main() { int i; while(~scanf("%d",&n)) { if(0==n) break; sum=0; for(i=1;i<=n;i++) { scanf("%d%d",&value[i],&num[i]); sum+=num[i]*value[i]; } Generating_function(); if(sum%3||a[sum/3]==0) { printf("sorry\n"); } else printf("%d\n",a[sum/3]); } return 0; }