题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2079
说明:要修n个学分,有K种学分,其中学分为b的有a门.看题 1 <= n <= 40, 1 <= k <= 8, 1 <= a <= 8, 1 <= b <= 10;
数据不是很大,暴力了解一下, 因为不知道有多少种学分,就不能提前用for循环,所以应该用递归,递归可以做多重循环。
#include<stdio.h>
#include<string.h>
int str[9];
int value[9];
int n,k;
int sum;
void fun(int t,int tp)
{
for( int i = str[t]; i >= 0; i--)
{
tp += i*value[t];// 有i个t学分的科目
if(tp > n) //发现大于n了,那么再修任何一门学科都是不可以的
{
tp -= i*value[t];
continue;
}
if(tp == n) sum++; //学分刚好是n, 加一
else
{
if(t < k)
fun(t+1,tp);
}
tp -= i*value[t]; //归的过程就是把相应的还原一下。
}
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
memset(value,0,sizeof(value));
memset(str,0,sizeof(str));
sum = 0;
scanf("%d %d",&n,&k);
for(int i = 1; i <= k; i++)
scanf("%d%d",&value[i],&str[i]);
fun(1,0);
printf("%d\n",sum);
}
fclose(stdin);
return 0;
}