问题描述:给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
1.贪心算法解决
代码如下:
package 算法设计与分析;
import java.util.Collections;
import java.util.Scanner;
import java.util.Arrays;
public class beibao {
public static void Knapsack(int n, float M,float wv[][],float x[]){
float [] b = new float[n+1];//数组b存储物品重量与价值的比值
for (int i = 1; i <= n; i++) {
wv[i][i] = wv[0][i]/wv[i][0];//对角线存储物品重量与价值的比值
b[i] = wv[0][i]/wv[i][0];
}
Arrays.sort(b);
int i;
for (i=1;i<=n;i++) x[i]=0;//x数组用来标记存储物品
float c=M;//c为背包容量
for (i=1;i<=n;i++) {//n为物品数量
for (int j = 1; j <= n; j++) {//利用对角线与b数组确定放入背包的物品
if (wv[0][j]>c) break;
if(b[i]==wv[j][j]) {
x[j]=1;
c -= wv[0][j];
}
}
}
if (i<=n)
for (i=1;i<=n;i++)
for (int j = 1; j <= n; j++) {
if(b[i]==wv[j][j])
x[j]=c/wv[0][j];//最后一个物品运行部分转入
}
System.out.println("装入物品的位置及数量:");
for(int j=1;j<=n;j++)
if(x[j]==1||x[j]==0)
System.out.print((int)x[j]+" ");
else {
System.out.print(x[j]);
}
System.out.println();
Solve(wv,x,n);
}
public static void Solve(float p[][],float q[],int m){//计算装入背包的总价值
float sum = 0;
for(int i=1;i<=m;i++)
sum += p[i][0]*q[i];
System.out.println("背包的最大价值为:"+sum);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入物品种类数:");
int n = in.nextInt();
System.out.println("请输入背包容量:");
float M = in.nextFloat();
float [][] wv = new float[n+1][n+1];//二维数组的第0行存储物品重量,第0列存储物品价值
float [] x = new float[n+1];
System.out.println("请输入物品价值:");
for(int i = 1;i <= n;i++) {
wv[i][0] = in.nextFloat();
}
System.out.println("请输入物品重量:");
for(int i = 1;i <= n;i++) {
wv[0][i] = in.nextFloat();
}
Knapsack( n, M, wv, x);
}
}
示例输入输出:
学习中,欢迎交流