题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2079
题目大意:知道需要组合出的数。知道了物品种类,每种的个数。
解题思路:直接模板
代码如下:
#include <stdio.h>
#include <string.h>
const int MAX=305;
int c1[MAX],c2[MAX];
int main()
{
int T,n,k,s1[15],s2[15];//s1为价值,s2为个数,和硬币问题类似
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
scanf("%d%d",&s1[i],&s2[i]);
memset(c1,0,sizeof(c1));
c1[0]=1;
for(int i=1; i<=k; i++)//循环每个因子
{
memset(c2,0,sizeof(c2));
for(int j=0; j<=s2[i]&&j*s1[i]<=n; j++)//每个因子的每一项,共有s2[i]+1项,每项的指数不能超过n
{
for(int k=0; k+j*s1[i]<=n; k++)//循环c1数组的每一项
c2[k+j*s1[i]] += c1[k];
}
memcpy(c1,c2,sizeof(c2));
}
printf("%d\n",c1[n]);
}
return 0;
}