貪心演算法(最優裝載)
阿新 • • 發佈:2020-12-21
技術標籤:最優裝載貪心演算法java貪心演算法動態規劃java
貪心演算法
文章目錄
前言
貪心演算法總是做出當前看來最好的選擇,但是最後在整體上看來也是最好的選擇。
也就是說選擇區域性最優,最終整體最優。
注意:貪心演算法並不考慮整體最優
一、貪心演算法是什麼?
1、貪心演算法意義
貪心演算法通過一系列的選擇得到問題的解。他所做出的每一個選擇都是當前狀態下區域性最好選擇(貪心選擇)。示例:當前有7個活動需要在同一場地舉行,這些活動開始鍵時間,結束時間不完全相同。現在給定一段時間,你能算出最多可以舉辦多少個活動嗎?
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;
}
}
}
}
}
}}
總結
提示:這裡對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了貪心演算法,簡單的舉了一個例子。可能會有後續~