物品数量N=5件
重量w分别是2 2 6 5 4
价值v分别是6 3 5 4 6
背包承重为M=10
背包内物品最大总和为15
5 10 2 2 6 5 4 6 3 5 4 6
15
使用递归+记忆化数组import java.util.Scanner;public class Main { static int w[]; static int v[]; static int dp[]; public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int N=scanner.nextInt(); w=new int[N]; v=new int[N]; int C=scanner.nextInt(); dp=new int[C+1]; for (int i = 0; i < N; i++) { w[i]=scanner.nextInt(); } for (int i = 0; i < N; i++) { v[i]=scanner.nextInt(); } for (int i = 0; i < N; i++) { //物品 for (int j = C; j >=w[i]; j--) { //容量 dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]); } } System.out.println(dp[C]); } }
import java.util.Scanner; public class Main { static int N; static int W; static int w[]; static int v[]; static int a[][]; static int dfs(int index,int C){ //C 表示当前容量 if(index>N)return 0; if(C<0)return 0; if(a[index][C]!=0)return a[index][C]; if(C-w[index]<0) { a[index][C]= dfs(index + 1, C); }else { a[index][C]= Math.max(v[index] + dfs(index + 1, C - w[index]), dfs(index + 1, C)); } return a[index][C]; } public static void main(String[] args) { Scanner reader=new Scanner(System.in); N= reader.nextInt(); W= reader.nextInt(); w=new int[N+1]; v=new int[N+1]; a=new int[N+1][W+1]; for (int i = 0; i < N; i++) { w[i]= reader.nextInt(); } for (int i = 0; i < N; i++) { v[i]= reader.nextInt(); } System.out.println(dfs(0,W)); } }