分析:一开始我也只想着用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; }
本文探讨了如何通过动态规划解决组合问题,并提供了一个具体的例子和实现代码。通过实例分析,作者强调了在解决此类问题时长心的重要性,以及如何利用背包算法的思想进行优化。
1万+

被折叠的 条评论
为什么被折叠?



