完全背包在理解01背包的基础上就容易做出了,01背包之所以使用倒序,是因为dp为一维数组,每次存放同一种物品只能存放一次,故采用倒序,采用正序就可能出现一个物品存放多次的情况。而正序存放的情况刚好适合完全背包问题。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] str = sc.nextLine().split(" ");
int n = Integer.parseInt(str[0]);//物品种类
int V = Integer.parseInt(str[1]);//背包体积
int[] v = new int[n+1];//每种物品的体积
int[] w = new int[n+1];//每种物品的价值
for(int i=1;i<=n;i++){
str = sc.nextLine().split(" ");
v[i] = Integer.parseInt(str[0]);
w[i] = Integer.parseInt(str[1]);
}
int[] dp = new int[V+1];
int[] dp2 = new int[V+1];
Arrays.fill(dp2,Integer.MIN_VALUE);
dp2[0] = 0;
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]);
dp2[j] = Math.max(dp2[j],dp2[j-v[i]]+w[i]);
}
System.out.println(dp[V]);
if(dp2[V]<0)
System.out.println(0);
else
System.out.println(dp2[V]);
}
}
京公网安备 11010502036488号