甲打算出去旅游,被告知最多可携带20公斤重的行李,已知甲想带的5件行李的重量及其在旅行中产生的效益如下表所示
行李编号 |
1 |
2 |
3 |
4 |
5 |
重量/千克 |
6 |
4 |
8 |
8 |
4 |
行李效益 |
8 |
4 |
8 |
10 |
2 |
为使所带的行李在旅行中产生最大的效益,请问甲应该带哪几件行李?
要求:请用表示从前i个行李中取出行李,并装入剩余负重为j的行李箱时所带来的最大效益。
算法设计思路
此问题可采用动态规划算法解决,首先创建functionE函数(形参为物品的个数n,背包的容量c,存有各个物品的重量的数组w,以及存放每件行李的效益的数组e),通过传入数据,将装入背包的行李数规模逐渐增大,直到产生最大效益。在过程中只会产生将当前行李装进去或者不装进去两种情况。如果行李的重量小于当前背包的容量则选择将行李装进背包或者不装进背包中产生效益最大的一中操作,如果大于则有可选行李数增加一但是背包的效益不变化。
import java.util.Scanner; public class 动态规划解背包问题 { static int n;//行李件数 static int c;//背包容量 static int w[] ;//行李重量 static int e[] ;//行李效益 static int [][]V ; public static void functionE(int n,int c,int w[],int e[]) { for(int i=1;i<=n;i++) {//行李编号从1开始 for(int j=0;j<=c;j++) { if(i==0||j==0) {//当可选行李为0或者背包剩余容量为0时,产生的效益为0 V[i][j]=0; } if(j>w[i]) {//背包的剩余容量大于行李的重量,选择将装进背包或者不装进背包中产生效益最大的方式 V[i][j]=Math.max(V[i-1][j-w[i]]+e[i],V[i-1][j]); } else {//背包的剩余容量小于行李的重量,不能装进背包 V[i][j]=V[i-1][j]; } } } } public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); c = in.nextInt(); w = new int[n+1]; e = new int[n+1]; V = new int [n+1][c+1]; for(int i=1;i<=n;i++) { w[i]=in.nextInt(); e[i]=in.nextInt(); } functionE(n,c,w,e); System.out.println(V[n][c]); } }