hdu2082
//母函数
#include<bits/stdc++.h>
using namespace std;
const int maxn=50+5;
int a[maxn],b[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[0]=1;
for(int i=1;i<=26;i++)
{
int num;
scanf("%d",&num);
if(num==0) continue;
for(int j=0;j<=50;j++)
{
for(int k=0;k<=num&&k*i+j<=50;k++)
{
b[k*i+j]+=a[j];
}
}
for(int k=0;k<=50;k++)
{
a[k]=b[k];
b[k]=0;
}
}
int solve=0;
for(int i=1;i<=50;i++)
{
solve+=a[i];
}
cout<<solve<<endl;
}
return 0;
}
hdu 1028
//母函数
#include<bits/stdc++.h>
using namespace std;
const int maxn=120+5;
int a[maxn],b[maxn];
int main()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i=0;i<=n;i++)
{
b[i]=0;
a[i]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
for(int k=0;k+j<=n;k+=i)
{
b[j+k]+=a[j];
}
}
for(int k=0;k<=n;k++)
{
a[k]=b[k];
b[k]=0;
}
}
cout<<a[n]<<endl;
}
return 0;
}
poj 1014
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+5;
int f[maxn],b[maxn];
int main()
{
int kase=0;
while(1)
{
int a[10],t=0,value=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&a[i]);
if(a[i]>=8) {
if(a[i]&1) a[i]=11;
else a[i]=12;
}
value+=a[i]*i;
if(a[i]==0) t++;
}
if(t==6) break;
bool flag=true;
printf("Collection #%d:\n",++kase);
if(value&1) flag=false;
else {
value/=2;
memset(f,0,sizeof(int)*value);
memset(b,0,sizeof(int)*value);
f[0]=1;
for(int i=1;i<=6;i++)
{
if(a[i]==0) continue;
for(int j=0;j<=value;j++)
{
for(int k=0;k<=a[i]&&k*i+j<=value;k++)
{
b[k*i+j]+=f[j];
}
}
memcpy(f,b,sizeof(b));
memset(b,0,sizeof(int)*value);
if(f[value]>0) break;
}
if(f[value]==0) flag=false;
}
if(flag) printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}
hdu 1521
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10+5;
int main()
{
double fac[maxn];
fac[0]=fac[1]=1;
for(int i=2;i<=10;i++)
fac[i]=fac[i-1]*(double)i;
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
double a[maxn];
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
double num1[maxn],num2[maxn];
for(int i=0;i<=m;i++)
{
num1[i]=0.0;
num2[i]=0.0;
}
for(int i=0;i<=a[0];i++)
{
num1[i]=1.0/fac[i];
}
for(int i=1;i<n;i++)
{
if(a[i]==0) continue;
for(int j=0;j<=m;j++)
{
for(int k=0;k<=a[i]&&k+j<=m;k++)
{
num2[k+j]+=num1[j]*(1.0/fac[k]);
}
}
for(int j=0;j<=m;j++)
{
num1[j]=num2[j];
num2[j]=0;
}
}
printf("%.0lf\n",fac[m]*num1[m]*1.0);
}
return 0;
}