zoukankan      html  css  js  c++  java
  • 整数划分 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);
        }
    }
  • 相关阅读:
    PHP按权重随机
    PHP将汉字转为拼音
    php支持解密的加密算法示例
    小波变换检测信号突变点的MATLAB实现
    OFDM通信系统的MATLAB仿真(2)
    OFDM通信系统的MATLAB仿真(1)
    java.lang.reflect.Constructor.getParameterTypes()方法示例
    createQuery 与 createNativeQuery 区别
    java.lang.StringBuilder.deleteCharAt()方法实例
    String.format()详细用法
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10061032.html
Copyright © 2011-2022 走看看