01背包和完全背包
01背包
题目介绍
有 N 件物品和一个容量为 V 的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,使装入的物品总价值最大
代码
参考文章:AcWing 2. 01背包问题(状态转移方程讲解) - AcWing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import java.util.Scanner;
public class Main{ public static void main(String[] args) { Scanner s = new Scanner(System.in); int N=s.nextInt(); int V=s.nextInt(); int[] v=new int[N+1]; int[] w=new int[N+1]; for (int i=1;i<=N;i++){ v[i]=s.nextInt(); w[i]=s.nextInt(); } s.close(); int[] dp=new int[V+1]; for(int i=1;i<=N;i++){ for(int j=V;j>=v[i];j--){ dp[j]=Math.max(dp[j],dp[j-v[i]]+w[i]); } } System.out.println(dp[V]); } }
|
完全背包
题目介绍
有 N 件物品和一个容量为 V 的背包,每件物品有各自的价值且都有无限件可用,要求在有限的背包容量下,使装入的物品总价值最大
代码
参考文章:AcWing 3. 完全背包问题 - AcWing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import java.util.Scanner; public class Main{ public static void main(String[] args)throws Exception{ Scanner s=new Scanner(System.in); int N=s.nextInt(); int V=s.nextInt(); int[] v=new int[N+1]; int[] w=new int[N+1]; for(int i=1;i<=N;i++){ v[i]=s.nextInt(); w[i]=s.nextInt(); } s.close(); int[] dp=new int[V+1]; for(int i=1;i<=N;i++){ for(int j=v[i];j<=V;j++){ dp[j]=Math.max(dp[j],dp[j-v[i]]+w[i]); } } System.out.println(dp[V]); } }
|
背记
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int[] dp=new int[V+1];
for(int i=1;i<=N;i++){ for(int j=V;j>=v[i];j--){ dp[j]=Math.max(dp[j],dp[j-v[i]]+w[i]); } }
for(int i=1;i<=N;i++){ for(int j=v[i];j<=V;j++){ dp[j]=Math.max(dp[j],dp[j-v[i]]+w[i]); } }
System.out.println(dp[V]);
|