1. 程式人生 > >最優裝載問題_貪心演算法

最優裝載問題_貪心演算法

    有一批集裝箱要裝上一艘載重量為c的輪船。其中集裝箱i的重量為Wi。最優裝載問題要求確定在裝載體積不受限制的情況下,將盡可能多的集裝箱裝上輪船。

    問題可以描述為:


    該問題可以用貪心演算法求解,要使用貪心演算法解決問題,我們必須先證明:(1)該問題具備貪心選擇性質;(2)該問題具備最優子結構性質.

    首先先證明貪心選擇性質:設集裝箱已依其重量從大到小排序,(x1,x2.......xn)是最優裝載問題的一個最優解。又設k=min{i|xi=1}{ 1<=i<=n}.易知,如果給定的最優裝載問題有解,則1<=k<=n;

      

    得以證明該問題具備貪心選擇性質。

    其次,證明該問題具備最優子結構性質:設(x1,x2....xn)是最優裝載的滿足貪心選擇性質的最優解,易知,x1=1,(x2,x3.....xn)是輪船載重量為c-w1,待裝船集裝箱為{2,3,.....n}時相應的最優裝載問題的最優解。得以證明,該問題具備最優子結構性質。

// OptimalLoading.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"

void outputResult(int *r,int len){
	printf("結果:");
	for (int i=0;i<len;i++)
	{
		printf("%d\t",r[i]);
	}
	printf("\n");
}
/************************************************************************/
/* 氣泡排序                                                                     */
/************************************************************************/
void sortBox(int *box,int n){
	for (int i=n-1;i>0;i--)
	{
		for(int j=0;j<i;j++){	
			
			if(box[j]>box[j+1]){
				int temp=box[j];
				box[j]=box[j+1];
				box[j+1]=temp;
			}
		}
	}
}
/************************************************************************/
/* 貪心選擇裝載                                                                     */
/************************************************************************/
void loading(int *box,int *r,int w,int n){
	
	r[0]=1;
	w-=box[0];
	for (int i=1;i<n;i++)
	{
		if(w-box[i]>=0){
			w-=box[i];
			r[i]=1;
		}
	}
	
}
int _tmain(int argc, _TCHAR* argv[])
{
	int w=100;
	int box[6]={100,20,25,25,20,20};
	sortBox(box,6);
	int result[6]={0};
	loading(box,result,w,6);
	outputResult(result,6);
	getchar();
	return 0;
}