又是一道母函數問題,不過又是按DP來做的,
是不是每一道都能用DP來做呢??
DP代碼
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { int dp[50],a[15]; int i,j,n,m,cas,b,c,k; scanf("%d",&cas); while(cas--) { scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d",&b,&c); a[b]=c; } memset(dp,0,sizeof(dp)); dp[0]=1; for(i=1;i<=m;i++) { for(j=n;j>=i;j--) { for(k=1;k<=a[i];k++) if(j-i*k>=0) { dp[j]+=dp[j-i*k]; // printf("%d\n",dp[j]); } } } printf("%d\n",dp[n]); } return 0; }
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <iomanip> int g[9],la[55],lb[55]; using namespace std; int main(int argc, char *argv[]) { int t,n,k,a,b; cin>>t; while(t--) { cin>>n>>k; memset(g,0,sizeof(g)); for(int i = 0; i < k; i++) { cin>>a>>b; g[a] = b; } memset(la,0,sizeof(la)); memset(lb,0,sizeof(lb)); for(int i = 0; i <= g[1]; i++) la[i] = 1; for(int i = 2; i <= 8; i++) { for(int j = 0; j <= 40; j++) { for(int k = 0,s = 0; (s<=g[i])&&(j+k<=40); k+=i,s++) lb[j+k] += la[j]; } for(int j = 0; j <= 40; j++) { la[j] = lb[j]; lb[j] = 0; } } cout<<la[n]<<endl; } return 0; }