计算一个数有多少种相加的结果集

回溯算法

输入 一个数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

本题使用全排列的方式计算结果

    @Test
    public void teset() {
        List<String> strings = generateTogether(6);
        strings.forEach(System.out::println);
    }

    public List<String> generateTogether(int n) {
        List<String> res = new ArrayList<>();
        generate(res, "", n, n);
        return res;
    }

    //max 表示后面的i的最大值,i对应的后面为相加的值
    private void generate(List<String> res, String ans, int max, int i) {
        if (i == 0){
            res.add(ans);
            return;
        }
        for (int j = i; j > 0; j--) {
            if (max >= j) {
                generate(res, ans +" "+ j,j,i-j);
            }
        }
    }

本题扩展
计算有多少种结果

例如 上题中 6 的结果又11

1 结果为1
2的结果为2
3的结果为3

本题采用动态规划的方法
思路

0 1 2 …… n
1 1 1 1 …… 1
2 1 1 2 …… dp[n]+=dp[n-2]
…… …… …… …… …… ……
n dp[0] dp[1] dp[2] …… dp[n]+dp[0]
   private long printResult(int n) {
        int dp[] = new int[n + 1];
        Arrays.fill(dp, 1);
        for (int i = 2; i <= n; i++) {
            for (int j = i; j <= n; j++) {
                dp[j] += dp[j - i];
            }
        }
       return dp[n];
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 13,809评论 0 5
  • 1. 下列叙述错误的是()。 (2.0 分) A. 质量管理包括QA和QC一切活动的全部过程 B. 影像质量是指对...
    我们村我最帅阅读 9,703评论 0 8
  • 01. 颅脑CT扫描采用的听眶线是()。 (1.0 分) A. 外耳孔与外眼眦的连线 B. 外耳孔上缘与眶下缘的连...
    我们村我最帅阅读 8,939评论 0 6
  • 201. M-Q型显影液组合是()。 (2.0 分) A. 米吐尔与菲尼酮的组合 B. 对苯二酚和菲尼酮的组合 C...
    我们村我最帅阅读 9,256评论 0 4
  • 命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求...
    yuzhiyi_宇阅读 1,864评论 0 0

友情链接更多精彩内容