题目:https://www.luogu.com.cn/problem/P1025
题目描述:
将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5;
1,5,1;
5,1,1;
问有多少种不同的分法。 (6 < n <= 200, 2 <= k <= 6)
solve1: dfs
要把n个苹果分为k份,
void dfs(int last, int Sum, int cnt)
last 表示上一份分到了多少个,
Sum表示到目前为止一共分了多少个,
cnt表示到目前为止一共分了多少份。
每一次都枚举这一次分多少个,
由于方案数不能相同,所以枚举的个数要保持递增(或递减),所以每次只要从last枚举到Sum+i*(k - cnt) <= n就可以了。
解释一下Sum+i*(k - cnt) <= n,
当前这一份我要分i个,那么从这以后每一次分的数量都要大于i,假设后面每一次都只分了i个,那么后面总共分了i*(k-cnt)个苹果,那分完k份总共分了Sum+i*(k - cnt)个苹果,如果此时Sum+i*(k - cnt) <= n,这就说明当后面每份都分i个的时候无法分完n个苹果,所以后面分的肯定要大于i。
#include<bits/stdc++.h>
using namespace std;
int n, k;
int ans = 0;
void dfs(int last, int Sum, int cnt)
{
if(cnt =&