背包问题

image.png
image.png

01背包

  1. // 4 5
  2. // 1 2
  3. // 2 4
  4. // 3 4
  5. // 4 5 v[] 大小 w[] 权重 f数组
  6. for (int i = 1; i <= n; i++) {
  7. for (int j = 0; j <= m; j++) {
  8. f[i][j] = f[i - 1][j];
  9. if (j >= v[i]) f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i]] + w[i]);
  10. }
  11. }
  12. //升级版 滚动数组
  13. // for (int i = 1; i <= n; i++)
  14. // for (int j = m; j >= v[i]; j--)
  15. // f[j] = Math.max(f[j],f[j-v[i]] + w[i]);
  16. System.out.println(f[n][m]);
  17. }
  18. }

1634470628844.jpg

完全背包问题

image.png

  1. for (int i = 1; i <= n; i++) {
  2. for (int j = 0; j <= m; j++) {
  3. for (int k = 0; k * v[i] < j; k++) {
  4. f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i] * k] + k * w[i]);
  5. }
  6. }
  7. }
  8. // for (int i = 1; i <= n; i++)
  9. // for (int j = v[i]; j <= m; j++)
  10. // f[j] = Math.max(f[j],f[j-v[i]] + w[i]);
  11. System.out.println(f[n][m]);
  12. }
  13. }

多重背包

  1. /*
  2. 拆成01背包来做,按二进制去拆
  3. 即 v,w,s = v,w,7 时:
  4. 正常拆分:-> (v,w),(v,w),(v,w),(v,w),(v,w),(v,w),(v,w)
  5. 二进制拆分:-> (v,w),(v<<1,w<<1),(v<<2,w<<2)
  6. */
  7. import java.util.*;
  8. public class Main{
  9. void run(){
  10. int n = jin.nextInt();
  11. int m = jin.nextInt();
  12. int p = 1;
  13. for (int i = 1; i <= n ; i++){
  14. int V = jin.nextInt();
  15. int W = jin.nextInt();
  16. int S = jin.nextInt();
  17. int k = 1;
  18. while (S > k){
  19. v[p] = V*k;
  20. w[p] = W*k;
  21. S -= k;
  22. k *= 2;
  23. p++;
  24. }
  25. if (S > 0){
  26. v[p] = V*S;
  27. w[p] = W*S;
  28. p ++;
  29. }
  30. }
  31. int res = dp(p, m);
  32. System.out.println(res);
  33. }
  34. int dp(int n, int m){
  35. int[] f = new int[maxN];
  36. for (int i= 1; i <= n ; i ++){
  37. for (int j = m ; j>= v[i] ; j--){
  38. f[j] = Math.max(f[j], f[j - v[i]] + w[i]);
  39. }
  40. }
  41. return f[m];
  42. }
  43. int maxN = 200002;
  44. int[] v = new int[maxN];
  45. int[] w = new int[maxN];
  46. Scanner jin = new Scanner (System.in);
  47. public static void main(String[] args) {new Main().run();}
  48. }

线性规划

三角问题

image.png

最长上升子序列

image.png
最长公共子序列
image.png

区间

image.png
image.png

计数(首位0问题)

image.png

状态压缩(位运算 待学习)

image.png

蒙德里安的梦想

image.png

树状DP

image.png

滑雪(递归)

image.png