整数拆分

题目详情

 

 

解题思路

1、暴力破解:复杂度高,动态规划:降低复杂度

动态规划思路

1、定义最优解dp[i]:表示容量为i的时候能够拆解的种类

2、定义重叠子问题:如果当前物品可以装,那么dp[i]就等于已经装过的种数加上dp[j - weights[i]], j - weights[i]表示如果拿取当前物品,剩下的容量可以容纳的最大种数

3、定义状态转移方程: dp[j] = dp[j] + dp[j - weights[i]]

4、定义初始值:dp[0] = 1,表示容量为0时只有一种装法

 

 代码

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {
            int capacity = input.nextInt();
            int[] weights = new int[capacity];
            int[] dp = new int[capacity + 1];
            dp[0] = 1;
            for (int i = 0; i < capacity; i++) {
                weights[i] = i + 1;
            }

            for (int i = 0; i < weights.length; i++) {
                int curCapacity = weights[i];
                for (; curCapacity <= capacity; curCapacity++) {
                    dp[curCapacity] = dp[curCapacity] + dp[curCapacity - weights[i]];
                }
            }
            System.out.println(dp[capacity]);
        }

    }

}

 

posted @ 2023-08-04 09:09  Adom_ye  阅读(16)  评论(0编辑  收藏  举报