zoukankan      html  css  js  c++  java
  • 1440:【例题1】数的划分

    1440:【例题1】数的划分

    类型

    DFS  可行性剪枝  上下界剪枝

    题解

    为了防止TLE,那就不能简单暴搜

    1.由于分解数字不考虑顺序,我们不如设定分解的数字依次递增,所以扩展节点时的下界>=前一个结点的值,也就是a[ i ] >= a[ i-1 ]

    2.那么上界呢?假设已经分解出了k份,那么 i + 1 份不超过 n' /(m-k+1) 

       因为你已经分解了k份,还有m-k+1份待分解,但是这 m-k+1份的和为 n' ,因为始终保证分解出的序列非递减,那么,第k份最大就是平均数

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int n,m,k,s;
    int a[10];
    
    void dfs(int k)    //分第K份 
    {
        if(n==0) return ;
        if(k==m)
        {
            if(n>=a[k-1])
            {
                s++;
                return ;
            }
        }
        for(int i=a[k-1];i<=n/(m-k+1);i++)  //第K份的上下界 
        {
            a[k]=i;           //第K份的值 
            n-=i;
            dfs(k+1);
            n+=i;
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        a[0]=1;              //初始条件 
        dfs(1);
        printf("%d",s);
    }
  • 相关阅读:
    Codeforces Round #534 (Div. 2) D. Game with modulo 交互题
    传球游戏 dp
    欧拉通路和欧拉回路
    HDU 1116
    HDU 4970
    HDU 4557
    HDU 4864
    HDU 1565
    HDU 3046
    HDU 4240
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10991756.html
Copyright © 2011-2022 走看看