貪心演算法 木棒問題

2021-10-23 02:51:30 字數 1501 閱讀 8173

1、問題描述

現有n根木棒,已知他們的長度和重量。要用一部木工機一根一根的加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模板的。

輸入:

輸入有多組測試例。輸入資料的第一行是測試例的個數t。

每個測試例兩行:

第一行是乙個整數n(1<=n<=5000),表示有多少根木棒;

第二行包括n*2個整數,表示l1,w1,l2,w2,l3,w3…ln,wn,其中li和wi表示第i根木棒的長度和重量。

資料由乙個或多個空格分隔。

輸出:

輸出是以分鐘為單位的最少準備時間,一行乙個。

樣例:

2、思路

本題僅僅使用貪心演算法是不夠的,排序之後還要使用動態規劃的演算法。

(1)資料結構

採用結構體表示木棒的資訊:

#define maxn 5001

struct stick

;stick data[maxn]; //存放所有木棒

(2)按木棒的長度使用貪心演算法

利用c++的標準模板庫函式sort()實現排序:sort(data, data+n, cmp);

排序函式cmp()的實現:

int cmp(stick a, stick b) 

(3)使用動態規劃的方法,計算重量w的最長單調遞增子串行的個數

用陣列b記錄重量w的分組序號。

在表中,4,5和9的組序號是1,1和2的組序號是2。

a[i].w(0≤i<n)最長遞增子串行的分組個數為:max

b[i]滿足最優子結構性質,可以遞迴地定義為:

b[0]=1;

b[i] = max +1,0≤j<i

3、**實現

#include#include#includeusing namespace std;

#define maxn 5001

struct stick

;stick data[maxn]; //存放所有木棒

int cmp(stick a, stick b)

//形參n是木棒的數量,stick是木棒引數的陣列

int lis(int n, stick a)

int main()

return 0;

}

貪心演算法,過載問題

說明 執行環境 ubuntu input.txt 6 50 2 3 13 8 80 20 裝入的資料是 2 3 8 13 20 output.txt 5 源 include include include include include define n 20 快速排序遞迴,a代表陣列,low代表陣...

貪心演算法 裝箱問題

貪心演算法中必須設定乙個貪心準則 來尋求每一步的最優解,但最後往往不是問題的整體最優解。問題 假設有n個物品,其體積為v1,v2,v3,v4.v n,有若干個體積為v的箱子 理論物品的體積應該小於箱子的體積 要求把所有物品全部裝入箱子中,要求開啟的箱子數最少。分析 怎樣合理化分配才能使得開啟的箱子數...

貪心演算法(裝箱問題)

貪心演算法的基本思想是找出整體當中每個小的區域性的最優解,並且將所有的這些區域性最優解合起來形成整體上的乙個最優解。因此能夠使用貪心演算法的問題必須滿足下面的兩個性質 1.整體的最優解可以通過區域性的最優解來求出 2.乙個整體能夠被分為多個區域性,並且這些區域性都能夠求出最優解。3.區域性最優解不一...