1. 程式人生 > 其它 >貪心演算法(最優裝載)

貪心演算法(最優裝載)

技術標籤:最優裝載貪心演算法java貪心演算法動態規劃java

貪心演算法

文章目錄


前言

貪心演算法總是做出當前看來最好的選擇,但是最後在整體上看來也是最好的選擇。
也就是說選擇區域性最優,最終整體最優
注意:貪心演算法並不考慮整體最優

一、貪心演算法是什麼?

1、貪心演算法意義

貪心演算法通過一系列的選擇得到問題的解。他所做出的每一個選擇都是當前狀態下區域性最好選擇(貪心選擇)。
示例:當前有7個活動需要在同一場地舉行,這些活動開始鍵時間,結束時間不完全相同。現在給定一段時間,你能算出最多可以舉辦多少個活動嗎?
活動編號 開始時間 結束時間 1 1 5 2 3 4 3 4 5 如果我們把結束時間從小到大排序(即留出最多的時間給後面的活動,最優選擇),在對剩下的有序活動進行選擇(下一個活動的開始時間大於前一個活動的結束時間)即可得出最優解。

2、貪心演算法使用條件

要使用貪心演算法,該問題需要具備:最優子結構性質貪心選擇性質

貪心選擇性質:選擇當前最優解,區域性最優。不考慮將來。

3、貪心演算法和動態規劃的區別

很多問題都能用貪心演算法和動態規劃得到最優解,但有的問題只能使用動態規劃(如01揹包),因為這些問題沒有貪心選擇性質。
動態規劃和貪心演算法都具有最優子結構性質,但貪心演算法還具備貪心選擇性質
,而動態規劃還具備子問題重疊性質

二、貪心演算法之最優裝載

1.問題描述

輸入包括兩部分, 第一行包括集裝箱個數n,以及船的裝載量C。 接下來n行每行則輸入集裝箱編號以及其重量。
輸出包括兩行,第一行為最多可裝載的集裝箱數量 。 第二行則為最優裝載方案對應的所有集裝箱編號(按照裝載次序輸出,用空格隔開) 。
輸入: 5 10 1 1 2 2 3 3 4 4 5 5 輸出: 4 1 2 3 4

2.問題分析

問題沒有提物品的價值,我們不需要考慮總價值,只需要確保個數最多。每次選擇最輕的,即存在貪心選擇。

3.程式碼

程式碼如下(示例):


import java.util.*;
import
java.util.Scanner; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in= new Scanner(System.in); while(in.hasNext()) { int n = in.nextInt(); int c = in.nextInt(); int arr[][]=new int[n][2]; for(int i=0;i<n;i++){ for(int j=0;j<2;j++){ arr[i][j]=in.nextInt(); } } private static void chioce(int[][] arr, int n,int c) { // TODO Auto-generated method stub int num=0; int sum=0; int d[]=new int [n]; for(int i=0;i<n;i++){ if(sum+arr[i][1]<=c){ sum+=arr[i][1]; num++; d[i]=arr[i][0]; } } System.out.println(num); for(int i=0;i<num;i++){ System.out.print(d[i]+" "); } System.out.println(); } //排序(氣泡排序)將重量從小到大排序 private static void sort(int[][] arr, int n) { // TODO Auto-generated method stub for(int i=0;i<arr.length-1;i++) { for(int j=0;j<arr.length-1-i;j++) { if(arr[j][1]>arr[j+1][1]) { int temp=arr[j][1]; arr[j][1]=arr[j+1][1]; arr[j+1][1]=temp; int temp1=arr[j][0]; arr[j][0]=arr[j+1][0]; arr[j+1][0]=temp1; } } } } } }}

總結

提示:這裡對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了貪心演算法,簡單的舉了一個例子。可能會有後續~