本文主要是介绍P1025 数的划分(dfs/dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目: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 =&
这篇关于P1025 数的划分(dfs/dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!