演算法第四章實踐報告
演算法第四章實踐報告
1.實踐題目名稱
4-1 程式儲存問題
2.問題描述
設有n 個程式{1,2,…, n }要存放在長度為L的磁帶上。程式i存放在磁帶上的長度是 li,1≤i≤n。 程式儲存問題要求確定這n 個程式在磁帶上的一個儲存方案, 使得能夠在磁帶上儲存儘可能多的程式。 對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。
3.演算法描述
先將n個程式按其長度由小到大排好序,然後將程式按順序放入磁帶,直至放不下為止。
具體程式碼實現如下:
#include <iostream>
#include <algorithm>
using namespace std;
int a[1001];
int main()
{
int n;
int length;
cin>>n>>length;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
int temp=length;
int count=0;
for(int j=0;j<n;j++)
{
if(temp>=a[j])
{
count++;
temp=temp-a[j];
}
else
continue;
}
cout<<count<<endl;
return 0;
}
該演算法滿足貪心選擇性質。因為貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇。每做一次貪心選擇,就將所求問題化簡為規模更小的子問題。因為該題要求磁碟可以裝儘量多的程式,因為磁碟的空間有限,想要裝多的程式,就應該優先選擇存長度短的程式,這樣每存入一個程式,待存的程式數目就會不斷減少,使得所求問題化簡為規模更小的子問題,並且每次選的都是當前長度最短的程式,所以都是區域性最優的選擇。綜上,該演算法滿足貪心選擇性質。
4.演算法時間複雜度
該程式進行了一次快排,時間複雜度為O(nlogn),並且該程式迴圈了n次,時間複雜度為O(n),因為O(nlogn)>O(n),所以,該程式的時間複雜度為O(nlogn)。
5.對貪心演算法的理解
“貪心演算法”顧名思義就是貪心,就是想要得到更多,想要接近自己的心中預期。其實貪心演算法總是做出在當前看來是最好的選擇,貪心演算法並不從整體最優上加以考慮,所做的選擇只是在某種意義上的區域性最優選擇,也希望達到一個整體最優解。但即使貪心演算法不能得到整體最優解,其最終結果也是最優解很好的近似解。
能用貪心演算法求解的問題應具有貪心選擇性質和最優子結構性質。貪心選擇性質:指問題的最優解可以通過一系列區域性最優解的選擇得到。貪心演算法做貪心選擇可以依賴於以往所做過的選擇,但決不依賴於將來所作的選擇,也不依賴於子問題的解。最優子結構性質:指問題的最優解包含其子問題的最優解。