hdu-2079
阿新 • • 發佈:2018-12-17
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
廢話不說,直接給程式碼;
#include<stdio.h> #include<string.h> using namespace std; const int maxn=100; int a[maxn],c1[maxn],c2[maxn]; int main() { int t,a1,a2,n,k; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); scanf("%d %d",&n,&k); for(int i=1;i<=k;i++) { scanf("%d %d",&a1,&a2); a[a1]+=a2; } for(int i=0;i<=a[1];i++) c1[i]=1; for(int i=2;i<=8;i++) { for(int j=0;j<=n;j++) { for(int k=0;k<=(a[i]*i);k+=i) c2[k+j]+=c1[j]; } for(int j=0;j<=n;j++) c1[j]=c2[j]; memset(c2,0,sizeof(c2)); } printf("%d\n",c1[n]); } return 0; }