借助这道题初步了解了下DP,呵呵。 #include "iostream" using namespace std; int ans[21][191]; int dp(int n) { int sum = 0; int flg = 0 ; ans[0][0]= 1; ans[1][0]= 1; ans[2][0]= 1; ans[2][1]= 1; for (int i=3 ; i<= n ; i++) { for (int j=0;j<=i;j++) { for (int r =0;r<191;r++) //这里代码费时,应该可以改进。 { if(ans[j][r] == 1) { sum = (i-j)*j + r; ans[i][sum] = 1; } } } } for (i=0; i<=190 ; i++) { if (ans[n][i] == 1 && flg == 0) { cout << i ; flg = 1; } else if (ans[n][i] == 1) { cout <<" "<< i; } } cout << endl ; return 0; } void main() { int n =0; while (cin >>n) { dp(n); } }