• 杭电ACM hdu 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

    Author
    xhd
     
    Source
    ACM程序设计期末考试_热身赛(感谢 xhd & 8600)

    ---------------------
    n是要获得的目的学分,K是可以获得单门学分的最高值

    #include <iostream>
    #include <cstring>
    using namespace std;
    #define min(a,b) ((a)<(b)?(a):(b))
    int T,N,K,n[8],v[8],a[42],b[42],i,j,k,last,last2;//用一个last变量记录目前最大的指数
    int main()
    {
      cin>>T;
      while ((T--)!=0)
      {
        cin>>N>>K;
        for (i=0;i<K;i++)
          cin>>v[i]>>n[i];//v[i]是存储不同课程的学分值,n[i]是储存每个学分对几个课程(每个学分可以使用的次数)
        a[0]=1;
        last=0;
        for (i=0;i<K;i++)
        {
          last2=min(last+n[i]*v[i],N);//计算下一个last
          memset(b,0,sizeof(int)*(last2+1));
          for (j=0;j<=n[i]&&j*v[i]<=last2;j++)
            for (k=0;k<=last&&k+j*v[i]<=last2;k++)
              b[k+j*v[i]]+=a[k];
          memcpy(a,b,sizeof(int)*(last2+1));
          last=last2;
        }
        cout<<a[N]<<endl;
      }
      return 0;
    }
  • 相关阅读:
    Class 'ViewCell' has no initializers
    xcode:关于Other Linker Flags
    NSString编码形式是UTF–16
    手写识别方案汇总
    将一个 view 进行截图
    程序员最核心的竞争力是什么?
    sqlite3
    创建NAT 64网络
    Snagit安装步骤
    cnblogs插件jiathis
  • 原文地址:https://www.cnblogs.com/-citywall123/p/9915255.html
Copyright © 2020-2023  润新知