码迷,mamicode.com
首页 > 其他好文 > 详细

选课时间

时间:2020-02-28 22:49:03      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:ott   turn   main   acm   eof   print   for   rip   组合   

此博客链接: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门。
 
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;
}

明天继续完成。

 

选课时间

标签:ott   turn   main   acm   eof   print   for   rip   组合   

原文地址:https://www.cnblogs.com/ping2yingshi/p/12380402.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!