完全背包
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int k = scan.nextInt();
int[] weight = new int[n+1];
int[] value = new int[n+1];
//weight和value数组读入的时候也从1开始读,下标要对上
scan.nextLine();
for(int i=1;i<=n;i++) {
weight[i]=scan.nextInt();
value[i]=scan.nextInt();
scan.nextLine();
}
//初始化
int[][] dp = new int[n+1][k+1];
for(int i=1;i<=k;i++) {
if(weight[1]<=i) {
dp[1][i]=dp[1][i-1]+value[1];
}
}
//背包遍历 i是物品 j是当前背包总容量
for(int i=2;i<=n;i++) {
for(int j=1;j<=k;j++) {
//如果该物品放不下,则不放
if(j<weight[i]) {
dp[i][j]=dp[i-1][j];
}else {
//放的下,则需取放or不放的最大值
dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);
}
}
}
System.out.println(dp[n][k]);
scan.close();
return;
}
LeetCode518. 零钱兑换 II
public int change(int amount, int[] coins) {
int n=coins.length;
int[] dp = new int [amount+1];
//初始化
dp[0]=1;
for(int i=0;i<n;i++) {
for(int j=coins[i];j<=amount;j++) {
dp[j]=dp[j]+dp[j-coins[i]];
}
}
return dp[amount];
}
LeetCode377. 组合总和 Ⅳ
public int combinationSum4(int[] nums, int target) {
int n=nums.length;
int[] dp = new int [target+1];
//初始化
dp[0]=1;
for(int i=1;i<=target;i++) {
for(int j=0;j<n;j++) {
if(nums[j]<=i) {
dp[i]=dp[i]+dp[i-nums[i]];
}
}
}
return dp[target];
}