knapSack 背包问题
Posted MirrorML
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了knapSack 背包问题相关的知识,希望对你有一定的参考价值。
背包
动态规划的基础案例: 几个背包问题
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。
解决核心是状态方程及第i个物品选或不选
max(dp[i],dp[j-i]+v)
01背包
01背包就是每种物品是只能选择一次。
若题目改为恰好装满背包,创建数组时除了物品,其他空间置为负无穷。
public class KnapSack01 {
public static void main(String[] args) {
int N,W;
Scanner scanner=new Scanner(System.in);
N=scanner.nextInt();
W=scanner.nextInt();
int[] dp=new int[12880];
for (int i=0;i<N;i++){
int m=scanner.nextInt();
int q=scanner.nextInt();
for (int j=W;j>=m;j--){
dp[j]=Math.max(dp[j],dp[j-m]+q);
}
}
System.out.println(dp[W]);
}
}
完全背包
完全背包就是每种物品是能多次选择。
public class KnapSack {
public static void main(String[] args) {
int N,W;
Scanner scanner=new Scanner(System.in);
N=scanner.nextInt();
W=scanner.nextInt();
int[] dp=new int[12880];
for (int i=0;i<N;i++){
int m=scanner.nextInt();
int q=scanner.nextInt();
for (int j=m;j<=W;j++){
dp[j]=Math.max(dp[j],dp[j-m]+q);
}
}
System.out.println(dp[W]);
}
}
总结
背包问题的核心就是状态的判定,自己多写几次更能理解。
以上是关于knapSack 背包问题的主要内容,如果未能解决你的问题,请参考以下文章