1. 程式人生 > >hdu2110(母函式)

hdu2110(母函式)

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;
}