背包问题
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? (说明,以下算法与教材147页给出的算法思想是一样的,教材上的算法事先对物品信息进行了排序)
void Knapsack(int n,float M,float v[],float w[],float x[])
{
Sort(n,v,w);
int i;
for (i=1;i<=n;i++) x[i]=0;
float c=M;
for (i=1;i<=n;i++) {
if (w[i]>c) break;
x[i]=1;
c-=w[i];
}
if (i<=n) x[i]=c/w[i];//最后一个物品选择部分装入
}
代码:
import java.util.Scanner;
public class Bag {
float Knapsack(float w[],float v[],float x[],float C,float n)
{
for(int i=0;i<n;i++){
x[i]=0;
}
int total=0;
int i;
for(i=0;i<n;i++)
if(w[i]>C)break;
else
{x[i]=1;
total=(int) (total+v[i]);
C=C-w[i];
}
if(i<n)x[i]=C/w[i];
total=(int) (total+x[i]*v[i]);
System.out.println("最大的价值为:"+total);
return total;
}
void sort(float w[],float v[],int n){
for(int i=0;i<n;i++){
for(int j=0;j<n-1-i;j++)
if(v[j]/w[j]<v[j+1]/w[j+1]){
int a,b;
a=(int) v[j];
v[j]=v[j+1];
v[j+1]=a;
b=(int) w[j];
w[j]=w[j+1];
w[j+1]=b;
}
}
}
public static void main(String[] args) {
int n;
Scanner s=new Scanner(System.in);
n=s.nextInt();
float w[]=new float[n];
float v[]=new float[n];
float x[]=new float[n];
System.out.print("输入一组物品的信息:");
for(int i=0;i<n;i++){
w[i]=s.nextFloat();
v[i]=s.nextFloat();
}
float C;
System.out.println("给定背包的容量为:");
C=s.nextFloat();
Bag a=new Bag();
a.sort(w, v, n);
System.out.println("排好序的顺序为:");
for(int i=0;i<n;i++){
System.out.println(w[i]+" "+v[i]);
}
a.Knapsack(w, v, x, C, n);
}
}
截图: