数的划分

    技术2024-04-14  84

    #数的划分

    【题目描述】 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。

    例如:n=7,k=3,下面三种分法被认为是相同的。

    {1,1,5};{1,5,1};{5,1,1};

    问有多少种不同的分法。 输出一个整数,即不同的分法。

    【输入】 两个整数n,k(6<n≤200,2≤k≤6),中间用单个空格隔开。

    【输出】 一个整数,即不同的分法。

    【输入样例】 7 3 【输出样例】 4 【提示】 四种分法为:{1,1,5};{1,2,4};{1,3,3};{2,2,3}。

    #题解

    起初想用暴搜解决,网上说防止TLE应该采用dfs

    数字总合为n,需要分解为k份,当分解到第m份时,它的取值最小等于a[m-1],最大等于n/(k-m+1),这便是m的取值范围。

    #include<iostream> using namespace std; int a[7],n,k,m,cnt=0; void dfs(int m){ if(m==k){ if(a[m-1]<=n){ cnt++; return ; } } for(int i=a[m-1];i<=n/(k-m+1);i++){//第m份的上下界 a[m]=i; n-=i;// dfs(m+1); n+=i;// } } int main(){ cin>>n>>k; a[0]=1;// dfs(1); cout<<cnt; return 0; }

    #还没有完全弄懂 这个深搜也也太难理解了叭。。。

    Processed: 0.021, SQL: 9