完全背包在理解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]); } }