又到了选课的时间了,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
Inputcopy | Outputcopy |
---|---|
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 | 2 445 |
#include<iostream>
#include<cstring>
using namespace std;
int v[80];
int dp[110];
int main() {
int cas;
cin >> cas;
while (cas--) {
int n,k;
cin >> n >> k;
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 0;i < k;i++) {
int a, b;
cin >> a >> b;
for (int j = n;j >= a;j--){
for (int l = 1;l <= b;l++){
if (j >= l * a)dp[j] = dp[j] + dp[j - l * a];
}
}
}
cout << dp[n] << endl;
}
}