首先这个题应该是一个01背包,背包容量为2022,有2022个物品,第i个物品的体积为i,只不过这里有两个限制条件,一个限制条件是和为2022,另一个限制条件为10个数,两个限制条件那就把加一维,加一维的遍历顺序还是逆序的,整体逆序遍历,转移方程为dp[i][j] = dp[i][j] + dp[i-1][j-k]; 这里k为体积为k;
这里解释一下,不管01背包怎么变,是几维的都要逆序遍历,如果正序遍历无法保证这个数字只使用一次。
还有一种确定方式就是这几个数的数是无序的。如果有一定顺序那就一定不能用01背包。
package com.js.datastructure.recursion.蓝桥.国特训练营.动态规划背包;
public class 背包01_2022 {
public static void main(String[] args) {
long[][] dp = new long[11][2023];
dp[0][0] = 1;
//01背包就是要
for (int i = 1; i < 2022; i++) {
for (int j = 10; j >= 1; j--) {
for (int k = 0; k < 2023; k++) {
if(k-i>=0){
dp[j][k] = dp[j][k] + dp[j-1][k-i];
}
}
}
}
System.out.println(dp[10][2022]);
}
}