HDU 2079-课程时间(生成函数)
生活随笔
收集整理的這篇文章主要介紹了
HDU 2079-课程时间(生成函数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
課程時間(標題已被修改,注意閱讀題)
Time Limit: 1000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2996????Accepted Submission(s): 2347
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再水一發。。
睡覺覺~
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cctype> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> #include <list> #define maxn 250 #define ll long long #define INF 0x3f3f3f3f #define pp pair<int,int> using namespace std; int a[maxn],b[maxn],v[10],p,num[10],n; void solve() {memset(a,0,sizeof(a));a[0]=1;for(int i=0;i<n;i++){memset(b,0,sizeof(b));for(int j=0;j<=num[i]&&j*v[i]<=p;j++)for(int k=0;k+j*v[i]<=p;k++)b[k+j*v[i]]+=a[k];memcpy(a,b,sizeof(b));}printf("%d\n",a[p]); } int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d",&p,&n);for(int i=0;i<n;i++)scanf("%d%d",&v[i],&num[i]);solve();}return 0; }版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的HDU 2079-课程时间(生成函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以变应变,才有出路
- 下一篇: AS问题解决系列1—Unable to