整数拆分
题目详情
解题思路
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]); } } }
Linux等环境软件安装