题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2082
题目大意:和普通型母函数解决的问题一样,就是加了个限制条件:要求指数<=50
题解:直接套用普通型母函数板子,修改一下内层循环的条件。
ac代码:
#include<iostream>
using namespace std;
const int maxn=10001;
int c1[maxn],c2[maxn];//c1表示已经乘开了的多项式的各项的系数 ,c2是中间数组,保存每一次的系数
int a[100],v[100];
int main(){
int n;
while(cin>>n){
while(n--){
for(int i=1;i<=26;i++){
cin>>a[i];//ai的个数
v[i]=i;//价值
}
for(int i=0;i<=50;i++)
{
c1[i]=0;
c2[i]=0;
}
for(int i=0;i<=a[1];i++)
{
c1[i]=1;
}
for(int i=2;i<=26;i++){//从第i个多项式开始和前面的多项式相乘
for(int j=0;j<=50;j++){ //和前面的项相乘后只看指数,
for(int k=0;k<=a[i]&&k*v[i]+j<=50;k++){//从第i个多项式里的第k项开始相乘,指数相加,所对应的项的系数相加
c2[j+k*v[i]]+=c1[j];//c2数组作为中间量,存储第i个多项式和前面已经乘开的多项式相乘后的多项式里每一项的系数
}
}
for(int j=0;j<=50;j++){
c1[j]=c2[j];//c2返回给c1
c2[j]=0;//将c2清零
}
}
//cout<<c1[n]<<endl;//指数为n的项的系数就是我们要求的方案数
int sum=0;
for(int i=1;i<=50;i++){
sum+=c1[i];
}
cout<<sum<<endl;
}
}
return 0;
}