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.區域性最優解不一...