此博客链接:https://www.cnblogs.com/ping2yingshi/p/12380402.html
选课时间(150min)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2079
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门。
每组数据的第一行是两个整数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
题解:
方法:动态规划的背包问题。
思路:今天看了01背包问题,目前这题还是不太理解。代码页没有通过。
代码如下:
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> int main() { int T; while (~scanf_s("%d",&T)) { int n, k; int a[9]; int b[11]; int c[40] = { 0 }; memset(c, 0, sizeof(c)); scanf_s("%d %d", &n,&k);//输入总分n,数量k for (int i=1;i<=k;i++)//读取学分a数量b { scanf_s("%d", &a[i]); scanf_s("%d", &b[i]); } c[0] = 1; for (int i = 1; i <= k; i++) {// for (int j = n; j >= a[i]; j--) {//分数 { for (int l = 1; l <=b[i]; l++)//数量 { if (j - a[i] * l >= 0) { c[j] = c[j] + c[j - a[i] * l]; } else break; } } } } printf("%d\n", c[n]); T--; } return 0; }
明天继续完成。