背包

Acwing

01背包采药

二维背包费用 宠物小精灵之收服

二维背包+ “至少”问题 潜水员

体积最大时方案数 背包问题求方案数

01背包最大体积具体方案 背包问题求具体方案

01背包固定体积方案数 数字组合(01背包方案数)

完全背包固定体积方案数 买书

完全背包固定体积方案数 货币系统

三重循环多重背包

多重背包拆分成01背包 多重背包问题 II

滑动窗口多重背包 多重背包问题 III

01分组背包 机器分配

力扣

01背包[采药]

  1. import java.util.*;
  2. import java.io.*;
  3. public class Main{
  4. static int[] f = new int[1010];
  5. static int[] v = new int[1010];
  6. static int[] w = new int[1010];
  7. public static void main(String[] args){
  8. Scanner scan = new Scanner(System.in);
  9. String[] input = scan.nextLine().split(" ");
  10. int T = Integer.valueOf(input[0]), M = Integer.valueOf(input[1]);
  11. for (int i = 1; i <= M; i ++){
  12. w[i] = scan.nextInt();
  13. v[i] = scan.nextInt();
  14. }
  15. for (int i = 1; i <= M; i ++){
  16. for (int j = T; j >= w[i]; j --){
  17. f[j] = Math.max(f[j], f[j - w[i]] + v[i]);
  18. }
  19. }
  20. System.out.println(f[T]);
  21. }
  22. }

1024. 装箱问题

更换顺序的典中典

  1. import java.util.*;
  2. import java.io.*;
  3. public class Main{
  4. static int[] f = new int[20010];
  5. static int[] w = new int[20010];
  6. public static void main(String[] args){
  7. Scanner scan = new Scanner(System.in);
  8. int V = scan.nextInt();
  9. int n = scan.nextInt();
  10. for (int i = 1; i <= n; i ++){
  11. w[i] = scan.nextInt();
  12. }
  13. for (int i = 1; i <= n; i ++){
  14. for (int j = V; j >= w[i]; j --){
  15. f[j] = Math.max(f[j], f[j - w[i]] + w[i]);
  16. }
  17. }
  18. System.out.println(V - f[V]);
  19. }
  20. }

宠物小精灵之收服

  1. import java.util.*;
  2. import java.io.*;
  3. public class Main{
  4. static int[][] f = new int[1010][510];
  5. static int[] ball = new int[110];
  6. static int[] damage = new int[110];
  7. public static void main(String[] args){
  8. Scanner scan = new Scanner(System.in);
  9. int total = scan.nextInt();
  10. int energy = scan.nextInt();
  11. int n = scan.nextInt();
  12. for (int i = 1; i <= n; i ++){
  13. ball[i] = scan.nextInt();
  14. damage[i] = scan.nextInt();
  15. }
  16. for (int i = 1; i <= n; i ++){
  17. for (int j = total; j >= ball[i]; j --){
  18. for (int k = energy - 1; k >= damage[i]; k--){
  19. f[j][k] = Math.max(f[j][k], f[j - ball[i]][k - damage[i]] + 1);
  20. }
  21. }
  22. }
  23. System.out.print(f[total][energy - 1] + " ");
  24. int resE = 0;
  25. for (int j = 0; j < energy; j ++)
  26. if (f[total][j] == f[total][energy - 1]){
  27. System.out.println(energy - j);
  28. break;
  29. }
  30. }
  31. }

完全背包固定体积求最值322. 零钱兑换

  1. class Solution {
  2. public int coinChange(int[] coins, int amount) {
  3. //完全背包
  4. int n = coins.length;
  5. int[] f = new int[amount + 1];
  6. Arrays.fill(f, Integer.MAX_VALUE);
  7. f[0] = 0;
  8. for (int i = 0; i < n; i ++){
  9. for (int j = coins[i]; j <= amount; j ++)
  10. if (f[j - coins[i]] != Integer.MAX_VALUE)
  11. f[j] = Math.min(f[j], f[j - coins[i]] + 1);
  12. }
  13. if (f[amount] == Integer.MAX_VALUE)return -1;
  14. else return f[amount];
  15. }
  16. }

普通完全背包279. 完全平方数

class Solution {
    public int numSquares(int n) {
        //完全背包
        List<Integer> v = new ArrayList<Integer>();
        v.add(0);
        for(int i = 1; i * i <= n; i ++)
            v.add(i * i);
        int m = v.size();
        int[] f= new int[n + 1];
        Arrays.fill(f, Integer.MAX_VALUE);
        f[0] = 0;
        for (int i = 1; i <= m - 1; i++)
            for (int j = v.get(i); j <= n; j++)
                f[j] = Math.min(f[j], f[j - v.get(i)] + 1);
        return f[n];                
    }
}