(1)背包问题。对上文中提到的背包问题提供的表1(数据文件下载,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
public class Knapsack {
public static int w=0;
public static int num=0;
public static void Knapsackm(String fileName){
File file = new File(fileName);
Reader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
tempchar = reader.read();
while(tempchar>=48 && tempchar<=57){
w=w*10+(tempchar-48);
tempchar = reader.read();
}
tempchar = reader.read();
while(tempchar>=48 && tempchar<=57){
num=num*10+(tempchar-48);
tempchar = reader.read();
}
int sw[]=new int[num];
int sv[]=new int[num];
int i=0,j=0,z=0,k=0;
while((tempchar=reader.read())!=-1)
{
if(tempchar>=48 && tempchar<=57){
i=i*10+(tempchar-48);
k=1;
}
if(tempchar==32){
if(k==1){
sw[j]=i; j++; k=0; i=0;
}
}
if(tempchar==10){
if(k==1){
sv[z]=i; z++; k=0; i=0;
}
}
}
for(int l=0;l<num;l++){
System.out.println("w= "+sw[l]+" v= "+sv[l]);
}
Knapsacks(sw,sv,w,num);
}catch (Exception e) {
e.printStackTrace();
}
}
public static int Knapsacks(int sw[],int sv[],int w,int num){
int vl=0;
int ul=0;
int it=1;
if(num<1) //如果剩余物品为零,就结束
return 0;
else{
for(int i=0;i<sv.length;i++){ //寻找所有物品中价值最大的
if(ul<sv[i]){
ul=sv[i];
vl=i;
}
}
if(sw[vl]<=w){ //判断该物品的重量是否超过背包的剩余容量
System.out.println("weight="+sw[vl]+" value="+sv[vl]);
sv[vl]=0; //将对应的价值数改为0,表示不参加后面的运算
w=w-sw[vl]; //背包的剩余容量减掉物品的重量
num=num-1; //物品可选数减1
it=Knapsacks(sw,sv,w,num);
}
else{
sv[vl]=0; //将对应的价值数改为0,表示不参加后面的运算
num=num-1; //物品可选数减1
it=Knapsacks(sw,sv,w,num);
}
return it;
}
}
public static void main(String args[]){
String s="G:\\Knapsack.txt";
Knapsackm(s);
}
}
运行结果: