zoukankan      html  css  js  c++  java
  • 整数分划

    一个整数n(n  <= 30)可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数。

    ---->  :  例如n = 6,程序输出为:

    6

    5  1

    4  2

    4  1  1

    3  3

    3  2  1

    3  1  1  1

    2  2  2

    2  2  1  1

    2  1  1  1  1

    1  1  1  1  1  1

    total = 11

    dfs:

    sum记录当前划分之和,ans记录可分化的个数,dq用来存储我们一次分划中产生的数字;(不过这个过程中重复了很多步骤,当然因为要输出分划的数字,想来是不可避免,如果只是记录total,可选择动态规划,见后面)

    dfs想法:从本身逐渐减小,同时sum进行判断,大于sum进行枝剪,小于则可以继续划分,等于则可以直接输出(双端队列便于操作);

    #include <iostream>
    #include <deque>
    #include <algorithm>
    using namespace std;
    
    int sum = 0, nn = 0, ans = 0;
    deque<int> dq;    // 便于删除、插入、遍历
    
    void dfs(int n) {    // 深度优先搜索,从 nn -> 1
        for (int i = n; i >= 1; i--) {    // 从nn往下遍历
            dq.push_back(i);
            sum += i;    
            if (sum > nn) {        // 剪枝
                sum -= i;
                dq.pop_back();
            }
            else if (sum == nn) {    // 输出
                deque<int>::iterator it;
                for (it = dq.begin(); it != dq.end(); it++)
                    if (it == dq.begin())
                        cout << *it;
                    else
                        cout << " + " << *it;
                cout << endl;
                sum -= i;
                ans++;
                dq.pop_back();
            } else {    // 深度搜索
                dfs(i);
                sum -= i;
                dq.pop_back();
            }
        }
    }
    
    int main() {
        cout << "please input nn : ";
        cin >> nn;
        dfs(nn);
        cout << "total = " << ans << endl;
        return 0;
    }

                       (这个怎么把它放成横着的。。。。)


    动态规划(total):

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int dp[7][7] = { 0 };
    
    void Split(int n, int k) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= k; j++) {
                if (i == 1 || j == 1)
                    dp[i][j] = 1;
                else if (i < j)
                    dp[i][j] = dp[i][i];
                else if (i == j)
                    dp[i][j] = dp[i][j - 1] + 1;
                else
                    dp[i][j] = dp[i][j - 1] + dp[i - j][j];
            }
        }
    }
    
    int main()
    {
        int n, k;
        cin >> n >> k;
        memset(dp, 0, sizeof(dp));
        Split(n, k);
        cout << dp[n][k] << endl;
        return 0;
    }

     2020-10-20

  • 相关阅读:
    序列化
    输入输出流——字符流部分
    输入输出流——字节流部分
    GitHub10岁之际HanLP自然语言处理包用户量跃居榜首
    hadoop大数据处理平台与案例
    dkhadoop的自然语言处理技术介绍
    hadoop大数据技术架构详解
    hadoop框架结构介绍
    Hadoop集群环境搭建步骤说明
    快速了解掌握中文自然语言处理
  • 原文地址:https://www.cnblogs.com/2015-16/p/13849839.html
Copyright © 2011-2022 走看看