• 整数划分 NBUT


    题目很简单,把一个正整数分割成N个正整数之和。但是你得把所有的划分方法列出来,以字典序升序排序。对于每种划分方法,小的数字在前面。

    思路:直接深度优先搜索,注意要判断前一位一定会比将要放入答案的因子小。这里,要设一个sum,当sum==n时,表示方案成功,应为sum在回溯的时候有用。

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int sum, num[55];
    void dfs(int cur, int n)
    {
        if (sum == n)
        for (int i = 1; i < cur; ++i)
        {
            printf("%d%c", num[i], " 
    "[i == cur - 1]);
        }
        else
        {
            for (int i = 1; i <= n; ++i)        //遍历所有分解
            {
                if (i >= num[cur - 1])//为了字典序和不重复,加上判断
                {
                    sum += i;
                    if (sum <= n)
                    {
                        num[cur] = i;
                        dfs(cur + 1, n);    //寻找下一位
                        sum -= i;        //回溯时减去i
                    }
                    else{
                        sum -= i;        //把i这个伪因子删去
                        return;
                    }
                }
            }
        }
    }
    int main()
    {
        int n;
        while (~scanf("%d", &n))
        {
            dfs(1, n);
        }
        return 0;
    }

    1192:放苹果(搜索)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int num[20];
    int sum, ans;
    void dfs(int cur, int n, int m)
    {
        if (n == sum)
        {
            ans++;
        }
        else if (cur>m)return;
        else 
        {
            for (int i = 1; i <= n; ++i)
            {
                if (num[cur - 1] <= i)
                {
                    sum += i;
                    if (sum <= n){
                        num[cur] = i;
                        dfs(cur + 1, n, m);
                    }
                    sum -= i;
                }
            }
        }
    }
    int main()
    {
        int t,n, m;
        scanf("%d", &t);
        while (t--)
        {
            sum = ans=0;
            scanf("%d%d", &n, &m);
            dfs(1, n, m);
            printf("%d
    ", ans);
        }
    }
  • 相关阅读:
    BZOJ4152: [AMPPZ2014]The Captain
    BZOJ4025: 二分图
    BZOJ1453: [Wc]Dface双面棋盘
    BZOJ3238: [Ahoi2013]差异
    BZOJ3165: [Heoi2013]Segment
    BZOJ4556: [Tjoi2016&Heoi2016]字符串
    BZOJ2668: [cqoi2012]交换棋子
    UVa-10652 包装木板
    HDU1599-Find the mincost route
    HDU-3339 IN ACTION(Dijkstra +01背包)
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10061032.html
Copyright © 2020-2023  润新知