桂林理工大學
實驗報告
班級軟體工程16-1班學號3162052051116姓名張識虔同組實驗者
實驗名稱貪心演算法日期2018年11月1日
一、實驗目的:
理解貪心演算法的思想,並能對給定的問題能設計出分治演算法予以解決。
二、實驗環境:
三、實驗內容:
給定n種物品和乙個揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大? (說明,以下演算法與教材147頁給出的演算法思想是一樣的,教材上的演算法事先對物品資訊進行了排序)
#include
using namespace std;
void sort(int n,float v,float w)
} }
} void knapsack(int n,float m,float v,float w,float x)
float c=m;
for(i=1;i<=n;i++)
if (i<=n) x[i]=c/w[i];//最後乙個物品選擇部分裝入
2. 教材170頁第18題。刪除數字求最小值
給定乙個n位正整數a, 去掉其中k個數字後按原左右次序將組成乙個新的正整數。對給定的a, k尋找一種方案,使得剩下的數字組成的新數最小。
操作物件為n位正整數,有可能超過整數的範圍,儲存在陣列a中,陣列中每乙個陣列元素對應整數的一位數字。
在整數的位數固定的前提下,讓高位的數字盡量小,整數的值就小。這就是所要選取的貪心策略。
每次刪除乙個數字,選擇乙個使剩下的數最小的數字作為刪除物件。
當k=1時,對於n位數構成的數刪除哪一位,使得剩下的資料最小。刪除滿足如下條件的a[i]:它是第乙個a[i]>a[i+1]的數,如果不存在則刪除a[n]。
當k>1(當然小於n),按上述操作乙個乙個刪除。每刪除乙個數字後,後面的數字向前移位。刪除乙個達到最小後,再從頭即從串首開始,刪除第2個,依此分解為k次完成。
若刪除不到k個後已無左邊大於右邊的降序或相等,則停止刪除操作,列印剩下串的左邊n−k個數字即可(相當於刪除了若干個最右邊的數字)。
#include
#include
#define n 100
using namespace std;
bool cmp(int a,int b)
int main()
for(i=1;i<=n;i++)
cout<
cin>>k;
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++) }
}cout<
if(flag) }
else }
return 0; }
數字都不相同時
數字都相同時
3.設有n個顧客同時等待一項服務。顧客i需要等待的服務時間為ti(1<=i<=n)。共有s處可以提供此服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n。
四、心得體會:
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...
作業排程問題之貪心演算法
include include struct node struct node a 20 b 20 intmain for i 1 i n i 按照截止時間排序,截止時間相同則按照value排序 for i 1 i for j i 1 j n j else if a i time a j time ...
演算法 貪心演算法
把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...