使用c++代码 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
时间: 2024-02-25 08:58:52 浏览: 154
以下是使用C++代码实现的解法,采用动态规划方法,时间复杂度为O(nkS),其中S是所有学分的总和。
```
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 45;
const int MAXS = 360;
int n, k;
int a[MAXN], b[MAXN];
long long dp[MAXS];
int main() {
int T;
cin >> T;
while (T--) {
cin >> n >> k;
int S = 0;
for (int i = 1; i <= k; i++) {
cin >> a[i] >> b[i];
S += a[i] * b[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= b[i]; j++) {
for (int s = S; s >= a[i]; s--) {
dp[s] += dp[s - a[i]];
}
}
}
cout << dp[n] << endl;
}
return 0;
}
```
阅读全文