dp[0] = 1; for (i = 1;i <= N;i++) for (j = n;j >= i ;j--) dp[j] += dp[j-i];
最后我们来思考第二个问: 要求只要 K 个,这怎么办呢???想想特殊情况…… 如果 K = 1 呢,只能是 N 咯,若果 N = 0 呢, 结果只能是 0 中可能啊,那同样N < K 的话,不可能分啊 结果为 0 ,好,特殊的考虑完了,那么我们再考虑,分的结果中有没有 1 , 如果有 那么就把剩下的 N - 1 分成 K - 1 份 , 如果没有呢,那么我们先拿出 K 份 给每一堆 一个1, 再把剩下的 N - K 分成 K 份就行了啊,好了,至此,递归方法出来了:
int work(int n,int k) { if (k == 1) return 1; if (n == 0) return 0; if (n < k) return 0; return work(n-k,k) + work(n-1,k-1); }