数的划分(DFS 动态规划)

mac2022-07-01  18

链接:https://ac.nowcoder.com/acm/problem/16695 来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入:n,k ( 6 < n ≤ 200,2 ≤ k ≤ 6 ) 输出:一个整数,即不同的分法。 输入描述: 两个整数 n,k ( 6 < n ≤ 200, 2 ≤ k ≤ 6 ) 输出描述: 1个整数,即不同的分法。 示例1 输入 复制 7 3 输出 复制 4

AC代码:

#include<iostream> using namespace std; int n,k,sum=0; //add已累加的值,time已遍历的部分,c下一部分填入值的最小值 void dfs(int add,int time,int c) { if(time==k) { if(add==n) sum++; //说明已运行到最后一位,无论符不符合都要回溯 return; } //i代表每一个部分的值,为了不重复后面部分的值一定要比前面的大,所以(k-time)*i+add<=n //为了保证后一部分的值比前一部分的值大,需要有int i=c for(int i=c;(k-time)*i+add<=n;i++) //累加值add+=i,已遍历部分数+1,下一部分最小值为此次已累加部分值i dfs(add+i,time+1,i); } int main() { cin>>n>>k; dfs(0,0,1); cout<<sum; return 0; }
最新回复(0)