试题链接:HDU1028:https://vjudge.net/problem/HDU-1028
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <sstream> #include <map> #include <set> #include <queue> #include <stdlib.h> #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; typedef long long ll; //解体思路:基本母函数的题,无限个1,2,3~~n可以用,问a[n]有多少种组成方式 int a[2005],b[2005]; int n; void init() { for (int i=0;i<=n;i++) { a[i]=0; b[i]=0; } a[0]=1; } int main() { while(cin >> n) { init();//初始化 for (int i=1;i<=n;i++) //一共n个变量(无限个1,2,3,~~n ) { for (int j=0;j<=n;j++) { for (int k=0;k+j<=n;k+=i) //k是新增多项式的指数,从k=0,i,2i,3i~~,需要注意的是这些多项式的系数都是1 { b[k+j]+=a[j]; //因为新增多项式的系数都是1,所以暂时储存的数组b,直接加a[j]就可以了 } } for (int j=0;j<=n;j++) { a[j]=b[j]; b[j]=0; } } cout << a[n] << endl; } return 0; }