2079 选课时间(题目已修改,注意读题)

时间:2021-09-19 15:05:13


选课时间(题目已修改,注意读题)

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2747    Accepted Submission(s): 2182


Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合。你来帮帮他吧。(xhd认为一样学分的课没区别)
 
Input 输入数据的第一行是一个数据T,表示有T组数据。
每组数据的第一行是两个整数n(1 <= n <= 40),k(1 <= k <= 8)。
接着有k行,每行有两个整数a(1 <= a <= 8),b(1 <= b <= 10),表示学分为a的课有b门。
 
Output 对于每组输入数据,输出一个整数,表示学n个学分的组合数。
 
Sample Input
2
2 2
1 2
2 1
40 8
1 1
2 2
3 2
4 2
5 8
6 9
7 6
8 8
 
Sample Output
2
445
 

//思路:①将学分为a的b门课中的a、b放入二维数组中;
// ②利用for循环的多重嵌套,计算不同学分的课中各选多少时能使学分为n,每遇到一次便记录下来,最后输出记录的次数。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,j,t,n,k,num;
cin>>t;
while(t--)
{
int p[8][2],q[8]={0};
memset(p,0,sizeof(p)); //将二维数组初始化为0
num=0;
cin>>n>>k;
for(i=0;i<k;i++)
cin>>p[i][0]>>p[i][1];
for(q[7]=0;q[7]<=p[7][1];q[7]++) //多重嵌套,因为会从最下面开始循环,所以是从上到下是7-0而不是0-7
for(q[6]=0;q[6]<=p[6][1];q[6]++)
for(q[5]=0;q[5]<=p[5][1];q[5]++)
for(q[4]=0;q[4]<=p[4][1];q[4]++)
for(q[3]=0;q[3]<=p[3][1];q[3]++)
for(q[2]=0;q[2]<=p[2][1];q[2]++)
for(q[1]=0;q[1]<=p[1][1];q[1]++)
for(q[0]=0;q[0]<=p[0][1];q[0]++)
if(p[0][0]*q[0]+p[1][0]*q[1]+p[2][0]*q[2]+p[3][0]*q[3]+p[4][0]*q[4]+p[5][0]*q[5]+p[6][0]*q[6]+p[7][0]*q[7]==n) //判断该可能是否总学分为n,是则num加1
num++;
cout<<num<<endl;
}
return 0;
}