Cara menggunakan algoritma tamak dalam C++

王林
Lepaskan: 2023-09-19 14:16:41
asal
1422 orang telah melayarinya

Cara menggunakan algoritma tamak dalam C++

Cara menggunakan algoritma tamak dalam C++

Algoritma tamak ialah algoritma berdasarkan prinsip pemilihan tamak Ia membuat pilihan yang optimum pada setiap langkah, dengan harapan akhirnya memperoleh penyelesaian optimum global. Dalam C++, kita boleh menggunakan algoritma tamak untuk menyelesaikan banyak masalah praktikal. Berikut akan memperkenalkan cara menggunakan algoritma tamak dalam C++ dan memberikan contoh kod tertentu.

1. Prinsip asas algoritma tamak
Algoritma rakus ialah algoritma heuristik Prinsip asasnya ialah memilih penyelesaian yang optimum pada masa ini dan berulang berturut-turut sehingga penyelesaian optimum global diperolehi. Algoritma tamak mempunyai ciri-ciri berikut:
1 Ia tidak dijamin untuk mendapatkan penyelesaian yang optimum, tetapi ia selalunya boleh mendapatkan penyelesaian yang lebih kurang optimum
2 Ia biasanya lebih cekap daripada algoritma lain seperti pengaturcaraan dinamik; Ia boleh menyelesaikan beberapa jenis masalah khas, seperti masalah pemilihan Aktiviti, masalah beg galas, dsb.

2. Penerapan algoritma tamak

Algoritma tamak boleh digunakan untuk banyak bidang:
1 Masalah pemilihan aktiviti: Andaikan terdapat n aktiviti, setiap aktiviti mempunyai masa mula dan masa tamat, bagaimana untuk mengaturnya supaya sebanyak mungkin aktiviti dapat dijalankan?
2. Masalah beg galas: Memandangkan kapasiti beg galas dan beberapa barang, setiap barang mempunyai berat dan nilai tersendiri Bagaimana cara memilih barang untuk dimasukkan ke dalam beg galas supaya jumlah nilai barang di dalam beg galas dimaksimumkan?
3. Masalah liputan selang: Memandangkan beberapa selang tertutup, pilih sesedikit mungkin untuk menampung keseluruhan selang sasaran.

3. Pelaksanaan Algoritma Greedy

Berikut mengambil masalah pemilihan aktiviti sebagai contoh untuk menerangkan secara terperinci cara menggunakan algoritma tamak dalam C++.

Penerangan masalah:

Andaikan ada n aktiviti, setiap aktiviti ada masa mula dan masa tamat. Ia dikehendaki memilih seberapa banyak aktiviti yang mungkin supaya aktiviti ini tidak bercanggah, iaitu tempoh masa mana-mana dua aktiviti tidak boleh bertindih.

Idea penyelesaian masalah:

1 Isih aktiviti mengikut masa tamat, memberi keutamaan kepada aktiviti dengan masa tamat awal
2 Pilih aktiviti pertama pada mulanya, dan kemudian pilih masa tamat seterusnya yang tidak bercanggah dengan masa tamat aktiviti sebelumnya.

Pelaksanaan kod:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//定义活动结构体
struct activity{
    int start;
    int end;
};

//比较函数,按照结束时间从小到大排序
bool compare(activity a1, activity a2){
    return a1.end < a2.end;
}

//贪心算法求解活动选择问题
int greedyActivitySelector(vector<activity>& activities){
    //按照结束时间从小到大排序
    sort(activities.begin(), activities.end(), compare);
    
    int result = 1;  //记录最终选择的活动数量
    int preEnd = activities[0].end;  //记录前一个活动的结束时间
    
    for(int i = 1; i < activities.size(); i++){
        if(activities[i].start >= preEnd){
            result++;
            preEnd = activities[i].end;
        }
    }
    
    return result;
}

int main(){
    vector<activity> activities;
    int n;
    cout << "请输入活动个数:" << endl;
    cin >> n;
    
    cout << "请输入每个活动的开始时间和结束时间:" << endl;
    for(int i = 0; i < n; i++){
        activity act;
        cin >> act.start >> act.end;
        activities.push_back(act);
    }
    
    int result = greedyActivitySelector(activities);
    cout << "可以选择的活动数量为:" << result << endl;
    
    return 0;
}
Salin selepas log masuk

Kod di atas melaksanakan algoritma tamak untuk masalah pemilihan aktiviti. Program ini mula-mula menyusun aktiviti input daripada kecil kepada besar mengikut masa tamat. Kemudian bermula dari aktiviti pertama, pilih aktiviti seterusnya yang tidak bercanggah dengan aktiviti sebelumnya, dan akhir sekali dapatkan bilangan aktiviti yang boleh dipilih.

4. Rumusan

Algoritma tamak adalah algoritma yang mudah dan cekap yang sering digunakan untuk menyelesaikan masalah praktikal. Kita boleh menggunakan bekas C++ dan perpustakaan algoritma dengan mudah untuk melaksanakan algoritma tamak, seperti bekas vektor, algoritma pengisihan, dsb. Walau bagaimanapun, perlu diingatkan bahawa algoritma tamak tidak sesuai untuk semua masalah, dan algoritma yang sesuai perlu dipilih mengikut ciri-ciri masalah tertentu.

Atas ialah kandungan terperinci Cara menggunakan algoritma tamak dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!