分析:一开始我也只想着用dfs()给写出来,后来发现判重还有剪枝啥的都不太好搞出来,于是这才想到用DP来解,往往组合问题可以当成是选择问题用背包来解,以后多长个心眼吧!这里我们用dp[i][j]表示前i个数(即1-i)中选择j个,
决策为选择k个i,则状态转移为dp[i][j]=Σ(k 0-4)dp[i-1][j-k]
直接上代码:
#include <cstdio> int dp[15][15]; int main() { dp[1][0] = dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = 1; for (int i = 2; i <= 13; i++) for (int j = 0; j <= 13; j++) for (int k = 0; k <= 4; k++) if (j >= k) dp[i][j] += dp[i - 1][j - k]; printf("%d\n", dp[13][13]); return 0; }