题目描述:
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
代码:
package lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int wiegth=scanner.nextInt();//背包大小int num=scanner.nextInt();//物品数量int[] w=new int[num+1];//重量int[] v=new int[num+1];//价值int dp[][]=new int[num+1][wiegth+1];for (int i = 1; i <= num; i++) {w[i]=scanner.nextInt();v[i]=scanner.nextInt();}for (int i = 1; i <= num; i++) {for (int j = 1; j <= wiegth; j++) {for (int k = 0; k*w[i] <=wiegth ; k++) {//k=0 每个物品拿的数量从0开始 最多k*w[i]不能超过 jif (j >= k*w[i]) {dp[i][j] = Math.max(dp[i][j], dp[i-1][j -k * w[i]] +v[i]*k);}else {dp[i][j]=dp[i][j];}}}}System.out.println("max="+dp[num][wiegth]);}
}