LowBit原理實現格雷碼的生成
1.演算法總結
貪心演算法的主要思想就是貪,就硬貪,雖然我可能不能考慮全域性,但我就是要貪,從區域性的最優選擇方案找到整體的最優解。
2.例題分析
設有n 個程式{1,2,…, n }要存放在長度為L的磁帶上。程式i存放在磁帶上的長度是 li,1≤i≤n。 程式儲存問題要求確定這n 個程式在磁帶上的一個儲存方案, 使得能夠在磁帶上儲存儘可能多的程式。 對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。
輸入格式:
第一行是2 個正整數,分別表示檔案個數n和磁帶的長度L。接下來的1行中,有n個正整數,表示程式存放在磁帶上的長度。
輸出格式:
輸出最多可以儲存的程式數。
輸入樣例:
在這裡給出一組輸入。例如:
6 50
2 3 13 8 80 20
輸出樣例:
在這裡給出相應的輸出。例如:
5
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n,length,num=0;
int a[10005];
cin>>n>>length;
for (int i = 0; i < n; i++){
cin>>a[i];
}
sort(a,a+n);
for(int i =0;i <n;i++){
if(length>=a[i]){
length -= a[i];
num++;
}else{
break;
}
}
cout<<num;
return 0;
}
演算法驗證:
假設題目所給的程式已從大到小排序a1,a2,a3,a4,a5。。。an
假設已有一個全域性最優解從大到小排序x1,x2,x3,x4,x5。。。xn
對於貪心演算法而言,總是先選擇an,如此類推,貪心演算法將得到最優解。
若xn不是an,則貪心演算法有更優解,