题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2110
题目大意:给出物品种类数及每种物品的个数及价值,和需要组合出的数
代码如下:
#include <stdio.h>
#include <string.h>
const int MAX=10005;
int c1[MAX],c2[MAX];
int main()
{
int T,v[102],num[102];//v为价值,num为数量,和硬币问题类似
while(scanf("%d",&T)&&T)
{
int sum=0;
for(int i=1; i<=T; i++)
{
scanf("%d%d",&v[i],&num[i]);
sum+=v[i]*num[i];
}
if(sum%3!=0)
{
printf("sorry\n");
continue;
}
sum/=3;
memset(c1,0,sizeof(c1));
c1[0]=1;
for(int i=1; i<=T; i++)//循环每个因子
{
memset(c2,0,sizeof(c2));
for(int j=0; j<=num[i]&&j*v[i]<=sum; j++)//每个因子的每一项
{
for(int k=0; k+j*v[i]<=sum; k++)//循环c1数组的每一项
c2[k+j*v[i]] += c1[k],c2[k+j*v[i]]%=10000;//呵呵,感觉按照题意最大值应该不会超过10000
} //因此感觉不用取模,但是不取模就wa
memcpy(c1,c2,sizeof(c2));
}
if(c1[sum])
printf("%d\n",c1[sum]);
else
printf("sorry\n");
}
return 0;
}