这题用母函数或者DP都可以 我用DP做的 感觉还是DP还是熟练一些 开一个标记数组 一个答案数组 如果标记数组
的值为真 那么就证明有一种硬币排列出j的值 那么从j再往上加i*i 的同时更新ans dp 就行了 用脑子模拟一下就可以了
#include <iostream> #include<cstdio> #include<cstring> using namespace std; bool dp[310]; int ans[310]; int main() { int n; memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); dp[0]=1; ans[0]=1; for(int i=1; i<=17; i++) for(int j=0; j+i*i<305; j++) if(dp[j]) { dp[j+i*i]=1; ans[j+i*i]+=ans[j]; } while(~scanf("%d",&n)&&n) printf("%d\n",ans[n]); return 0; }
时间: 2024-09-19 17:22:27