テーブル埋めていくタイプの組み合わせ数のDP!
ループまわす順番間違えると重複数えしたりするから気をつけよう
#include <iostream> #include <cstdlib> #include <cmath> #include <vector> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) int main(){ vector<int> tbl; int dp[301] = {0}; for(int i=1 ; i*i<= 300 ; i++)tbl.push_back(i*i); dp[0] = 1; for(int j = 0; j < tbl.size() ; j++){ for(int co = tbl[j]; co <= 300 ; co++){ dp[co] += dp[co-tbl[j]]; } } int n; while(cin >> n , n){ cout << dp[n] << endl; } }