1. public class Test02 {
  2. public static void main(String[] args) {
  3. int[]value=new int[]{15,20,30};
  4. int[]weight=new int[]{1,3,4};
  5. int packageSize=4;
  6. Test02 test02 = new Test02();
  7. test02.testPageageProblem(value,weight,packageSize);
  8. }
  9. public int testPageageProblem(int[]value,int[]weight,int packageSize){
  10. //完全背包
  11. int[]dp=new int[packageSize+1];
  12. //第一种方式,外层遍历物品,内层遍历背包
  13. for(int i=0;i<value.length;i++){
  14. for(int j=weight[i];j<=packageSize;j++){
  15. dp[j]=Math.max(dp[j],value[i]+dp[j-weight[i]]);
  16. }
  17. }
  18. for (int i : dp) {
  19. System.out.print(i+" ");
  20. }
  21. return dp[packageSize];
  22. }
  23. public int testPageageProblem2(int[]value,int[]weight,int packageSize){
  24. int[]dp=new int[packageSize+1];
  25. //第二种方式,外层遍历背包,内层遍历物品
  26. for(int i=1;i<=packageSize;i++){
  27. for(int j=0;j<value.length;j++){
  28. if(i-weight[j]>=0){
  29. dp[i]=Math.max(dp[i],value[j]+dp[i-weight[j]]);
  30. }
  31. }
  32. }
  33. for (int i : dp) {
  34. System.out.print(i+" ");
  35. }
  36. return dp[packageSize];
  37. }
  38. }

518. 零钱兑换 II

  1. int packageSize=amount;
  2. int[]dp=new int[packageSize+1];
  3. dp[0]=1;
  4. for(int i=0;i<coins.length;i++){
  5. for(int j=coins[i];j<=packageSize;j++){
  6. dp[j]+=dp[j-coins[i]];
  7. }
  8. }
  9. return dp[packageSize];
  10. 这题必须外层遍历物品,内层遍历背包;否则会有重复计算,比如1+22+1

377. 组合总和 Ⅳ

  1. int packageSize=target;
  2. int[]dp=new int[packageSize+1];
  3. //外层遍历背包,内层遍历物品
  4. dp[0]=1;
  5. for(int i=1;i<=packageSize;i++){
  6. for(int j=0;j<nums.length;j++){
  7. if(i-nums[j]>=0){
  8. dp[i]+=dp[i-nums[j]];
  9. }
  10. }
  11. }
  12. return dp[packageSize];
  13. //为什么需要外遍历背包,内层遍历物品,因为是排列的总和,所以可以重复计算

322. 零钱兑换

  1. int packageSize=amount;
  2. int[]dp=new int[packageSize+1];
  3. Arrays.fill(dp,Integer.MAX_VALUE);
  4. dp[0]=0;
  5. //外物内包
  6. for(int i=0;i<coins.length;i++){
  7. for(int j=coins[i];j<=packageSize;j++){
  8. if(dp[j-coins[i]]!=Integer.MAX_VALUE){
  9. dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);
  10. }
  11. }
  12. }
  13. return dp[packageSize]==Integer.MAX_VALUE?-1:dp[packageSize];

279. 完全平方数

  1. int packageSize=n;
  2. int[]dp=new int[packageSize+1];
  3. for(int i=1;i<dp.length;i++){
  4. dp[i]=i;
  5. }
  6. //外包内物
  7. for(int i=1;i<=packageSize;i++){
  8. for(int j=1;j*j<=i;j++){
  9. dp[i]=Math.min(dp[i-j*j]+1,dp[i]);
  10. }
  11. }
  12. return dp[packageSize];

139. 单词拆分

  1. int packageSize=s.length();
  2. boolean[]dp=new boolean[packageSize+1];
  3. dp[0]=true;
  4. for(int i=1;i<=packageSize;i++){
  5. for(int j=0;j<i;j++){
  6. if(wordDict.contains(s.substring(j,i))&&dp[j]==true){
  7. dp[i]=true;
  8. }
  9. }
  10. }
  11. return dp[packageSize];