2 2 貪心演算法

2021-08-21 17:38:11 字數 3526 閱讀 1172

貪心演算法就是遵循某種規則,不斷貪心的選取當前最優策略的演算法設計方法。

有1元、5元、10元、50元、100元、500元的硬幣各c1,c5,c10,c50,c100,c500枚。現在要用這些硬幣來支付a元,最少需要多少枚硬幣?假設本題至少存在一種支付方案。 

限制條件: 

0<=c1,c5,c10,c50,c100,c500<=10^9

0<= a <= 10^9

輸入:c1 = 3   c2 = 2     c10 = 1    c50 = 3    c100 = 0      c500 = 2    a = 620 

輸出: 6(500元硬幣1枚,50元硬幣2枚,10元硬幣1枚,5元硬幣2枚,合計6枚) 

解題思路:為了盡量地減少硬幣的數量,我們首先得盡可能多地使用500元硬幣,剩餘部分盡可能多地使用100元硬幣,剩餘部分盡可能多地使用50元硬幣,剩餘部分盡可能多地使用10元硬幣,再剩餘部分盡可能多地使用5元硬幣,最後的部分使用1元硬幣支付。

#include #include //void min(int i,int j)

//void solve(int a);

const int c[6] = ;

int ans=0;//硬幣枚數

for(int i=5;i>=0;i--)

printf("%d\n",ans);

}int main()

問題描述:有n項工作,每項工作分別在si開始,ti結束。對每項工作,你都可以選擇參加或不參加,但選擇了參加某項工作就必須至始至終參加全程參與,即參與工作的時間段不能有重疊(即使開始的時間和結束的時間重疊都不行)。

限制條件:

1<=n<=100000

1<=si<=ti,=10^9

樣例:輸入

n = 5, s= , t=

輸出3(選擇工作1, 3, 5)

對這個問題,如果使用貪心演算法的話,可能有以下幾種考慮:

(1)、每次選取開始時間最早的;

(2)、每次選取結束時間最早的;

(3)、每次選取用時最短的;

(4)、在可選工作中,每次選取與最小可選工作有重疊的部分;

只有(2)是正確沒有反例的;

#include #include const int max_n = 100000;

int n = 5,s[max_n] = , t[max_n] = ;

//n項工作,s為開始時間,t為結束時間

//pairitv[max_n];//用於對工作排序的pair陣列

pair 預設對first公升序,當first相同時對second公升序;//

void sort(int s,int t)

if(t[i] == t[i+1])}}

j++;

} int ans = 0, t = 0;//t是最後所選工作結束的時間

/*結束時間小於下乙個最先結束可執行時間,

*/for (int i = 0; i < n; i++)

}//cout << ans << endl;

printf("%d",ans);

} void solve()

/*sort:首先根據first進行排序,first資料相同根據second排序【重點(注意sort執行的過程)】

按照由小及大進行排序,即按照結束時間最小進行排序,結束時間相同按照開始時間最小進行排序。

*/sort(s, t);

// int ans = 0, t = 0;//t是最後所選工作結束的時間

// /*

// 結束時間小於下乙個最先結束可執行時間,

// */

// for (int i = 0; i < n; i++)

//

// }

// //cout << ans << endl;

// printf("%d",ans);

}int main()

問題描述:給定長度為n的字串s,要構造乙個長度為n的字串t。期初,t是乙個空串,隨後反覆進行下列任意操作:

1>從s的頭部刪除乙個字元,加到t的尾部; 

2>從s的尾部刪除乙個字元,加到t的尾部。

目標是要構造字典序盡可能小的字串t。

舉例:

比如當n=6,s=」acdbcb」時,程式應輸出abcbcd。

思路: 

將s反轉後的字串定為s』,比較s和s』的字典序,如果s較小則從s開頭取字元加到t的末尾,反之從s末尾取字元加到t的末尾。字典序相同時兩者等價,取哪個都行。

字典排序(lexicographical order)是一種對於隨機變數形成序列的排序方法。其方法是,按照字母順序,或者數字小大順序,由小到大的形成序列。

#include #include char t[10],s[10],k[10];

int main()

//t[m]是正,s[a]是反

for(int m=0;m<=n;m++)

if(t[m]==s[a])

if(t[m]問題描述:

直線上有n個點,點i的位置是xi。從這n個點中選擇若干個,給它們加上標記。對每乙個點,其距離為r以內的區域裡必須有帶標記的點(本身為帶有標記的點,可以認為與其距離為0的地方有乙個帶有標記的點)。在滿足這個條件的情況下,希望能為盡可能少的點新增標記。求最少要有多少個點被加上標記。

限制條件:

/*610

1,7,15,20,30,50

*/#include #include void solve(int a,int n,int r)

int start2 = a[i-1];//標記點

//一直向右前進直到距離標記點距離大於r

while (i < n && start2 + r >= a[i])

ans++;

} printf("%d",ans);

}void sort()

int main()

//計算到木板為1塊為止

while(n>1)

else if(l[i]

}//合併兩板

int combine=l[mii1]+l[mii2];

ans+=combine;

//mii1的位置放合併板,mii2的位置放最後一塊板

if(mii1==n-1) swap(mii1,mii2);

l[mii1]=combine;

l[mii2]=l[n-1];

n--;

}cout<

return 0;

}

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...