背包的最大价值
有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
输入物品数:5
输入每件物品的重量:2,2,6,5,4
它们的价值:6,3,5,4,6
输出:最大的价值总和 15
输入物品数:5
输入每件物品的重量:144,487,210,567,1056
它们的价值:990,436,673,58,897
输出:最大的价值总和 2099
![](https://images2017.cnblogs.com/blog/1214952/201711/1214952-20171107085831684-165919776.png)
import java.util.Scanner;
public class bag {
private static int t = 0;
public static void main(String[] args) {
int max = new Scanner(System.in).nextInt();
int n = new Scanner(System.in).nextInt();
int m = 0;//重量的定位
int w = 0;//下标的定位
int golbe = 0;
int a[] = new int[n];//重量数组
int p[] = new int[n];//价值数组
int b[] = new int[n];//选中数组
int k[] = new int[100];//所有可能结果
for (int i = 0; i < a.length; i++) {
a[i] = new Scanner(System.in).nextInt();
}
for (int i = 0; i < p.length; i++) {
p[i] = new Scanner(System.in).nextInt();
}
f(a,p,b,k,max,n,m,w,golbe);
int fin = k[0];
for (int i = 0; i < k.length-1; i++) {
if(k[i+1]>fin){
fin = k[i+1];
}
}
System.out.println("fin:"+fin);
}
private static void f(int[] a, int[] p, int[] b, int[] k, int max, int n, int m, int w, int golbe) {
if(m<max&&w<n){
for (int i = w; i < n; i++) {
if(b[i]!=0){
continue;
}else{
b[i]=1;
m += a[i];
f(a,p,b,k,max,n,m,w+1,golbe);
b[i] = 0;
m -= a[i];
f(a,p,b,k,max,n,m,w+1,golbe);
break;
}
}
}else{
if(m>max){
for (int i = a.length-1; i >=0; i--) {
if(b[i]==1){
b[i]=0;
break;
}
}
}
for (int i = 0; i < b.length; i++) {
if(b[i]==1){
golbe += p[i];
}
}
k[t] = golbe;
t++;
}
}
}
答案仅供参考