算法设计与分析之贪心算法

背包问题

package pratice;
import java.util.Scanner;
public class Loadmax {
	//快速排序法排序返回装载量由小到大的数组下标
			public static int[] quickSort(int arr[],int low,int high) {
				
				int valueindex[]=new int[high+1];
				for(int i=0;i<high+1;i++) {
					valueindex[i]=i;
				}
				int i,j,temp,t,index;
		        if(low>high){
		            return valueindex ;
		        }
		        
		        i=low;
		        j=high;
		        //temp就是基准位
		        temp = arr[low];
		 
		        while (i<j) {
		            //先看右边,依次往左递减
		            while (temp<=arr[j]&&i<j) {
		                j--;
		            }
		            //再看左边,依次往右递增
		            while (temp>=arr[i]&&i<j) {
		                i++;
		            }
		            //如果满足条件则交换
		            if (i<j) {
		                t = arr[j];
		                arr[j] = arr[i];
		                arr[i] = t;
		                
		                index=valueindex[j];
						valueindex[j]=valueindex[j+1];
						valueindex[j+1]=index;
		                
		            }
		 
		        }
		        //最后将基准为与i和j相等位置的数字交换
		         arr[low] = arr[i];
		         arr[i] = temp;
		        //递归调用左半数组
		        quickSort(arr, low, j-1);
		       quickSort(arr, j+1, high);
		       return valueindex;
				
			}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入集装箱个数:");
		int num = sc.nextInt();
		System.out.println("请输入船的载重量:");
		int capacity = sc.nextInt();
		int sheng=capacity;
		int shengyu=0,totalweight=0;
		int weight[] = new int[num];
		int weightindex[]=new int[num];
		int	output[]= new int[num];
		System.out.println("请输入集装箱重量:");
		for(int i=0;i<num;i++) {
			weight[i]=sc.nextInt();
		}
		for(int i=0;i<num;i++) {
			output[i]=0;
		}
		sc.close();
		//接受从小到大的排序的下标
		weightindex=quickSort(weight,0,num-1);
		for(int i =0;i<num;i++) {
			if(weight[weightindex[i]]<=sheng) {
				totalweight=totalweight+weight[weightindex[i]];
				sheng=capacity-totalweight;
				output[weightindex[i]]=1;	
			}
			else {	
				break;//跳出循环	
			}		
		}
		System.out.println("装载方案为:");
		for(int i=0;i<num;i++) {
			System.out.print(output[i]);
			System.out.print(" ");
		}
		System.out.println("");	
		System.out.print("最大剩余载重为:");
		System.out.println(sheng);	
 }
}

 最优装载问题

 

package pratice;
import java.util.Scanner;

public class Bag {
		//快速排序返回单位质量价值由大到小的数组下标
		
			public static int[] quickSort(int arr[],int low,int high) {
				
				int valueindex[]=new int[high+1];
				for(int i=0;i<high+1;i++) {
					valueindex[i]=i;
				}
				int i,j,temp,t,index;
		        if(low>high){
		            return valueindex ;
		        }
		        
		        i=low;
		        j=high;
		        //temp就是基准位
		        temp = arr[low];
		 
		        while (i<j) {
		            //先看右边,依次往左递减
		            while (temp<=arr[j]&&i<j) {
		                j--;
		            }
		            //再看左边,依次往右递增
		            while (temp>=arr[i]&&i<j) {
		                i++;
		            }
		            //如果满足条件则交换
		            if (i<j) {
		                t = arr[j];
		                arr[j] = arr[i];
		                arr[i] = t;
		                
		                index=valueindex[j];
						valueindex[j]=valueindex[j+1];
						valueindex[j+1]=index;
		                
		            }
		 
		        }
		        //最后将基准为与i和j相等位置的数字交换
		         arr[low] = arr[i];
		         arr[i] = temp;
		        //递归调用左半数组
		        quickSort(arr, low, j-1);
		       quickSort(arr, j+1, high);
		       return valueindex;
}		
public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入物品个数:");
			int num = sc.nextInt();
			System.out.println("请输入背包容量:");
			float capacity = sc.nextInt();
			float sheng=capacity;
			float totalvalue=0,shengyu=0,totalweight=0;
			int weight[] = new int[num];
			int value[] = new int[num];
			int valueindex[]=new int[num];
			int pervalue[]= new int[num];
				float	output[]= new float[num];
			System.out.println("请输入物品重量:");
			for(int i=0;i<num;i++) {
				weight[i]=sc.nextInt();
			}
			System.out.println("请输入物品价值:");
			for(int i=0;i<num;i++) {
				value[i]=sc.nextInt();
			}
			sc.close();
			for(int i=0;i<num;i++) {
				pervalue[i]=value[i]/weight[i];
			}
			for(int i=0;i<num;i++) {
				output[i]=0;
			}
			//返回单位质量价值由大到小的数组下标
			valueindex=sort(pervalue,num);
			for(int i =0;i<num;i++) {
				if(weight[valueindex[i]]<sheng) {
					totalvalue=totalvalue+value[valueindex[i]];
					totalweight=totalweight+weight[valueindex[i]];
					sheng=capacity-totalweight;
					output[valueindex[i]]=weight[valueindex[i]];
					
				}
				else {
					totalvalue=totalvalue+pervalue[valueindex[i]]*sheng;
					output[valueindex[i]]=sheng;
					break;//跳出循环
					
				}		
			}
			System.out.println("物品容量安排为:");
			for(int i=0;i<num;i++) {
				System.out.print(output[i]);
				System.out.print(" ");
			}
			System.out.println("");
			System.out.print("最大价值为:");
			System.out.println(totalvalue);		
		}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值