Cara Menyelesaikan Masalah Knapsack Pecahan dalam C++

Cara Menyelesaikan Masalah Knapsack Pecahan Dalam C



Masalah ransel pecahan dalam C++ merujuk kepada mengenal pasti cara untuk mengisi beg dengan item dengan berat tertentu dan untung dengan cara yang beg itu mengandungi nilai maksimum tanpa melebihi had maksimum.

Cara Menyelesaikan Masalah Knapsack Pecahan dalam C++

Memandangkan satu set item, setiap satu dengan berat dan keuntungan yang diberikan, tentukan setiap bilangan item dalam kombinasi sedemikian sehingga jumlah berat item adalah kurang daripada had maksimum beg, tetapi nilainya mesti disimpan sebesar mungkin.







Algoritma Untuk Melaksanakan Masalah Knapsack Pecahan

Fungsi algoritma Knapsack boleh difahami melalui perkara berikut:



  • Ambil dua susunan berat dan untung.
  • Tetapkan nilai guni maksimum kepada W.
  • Tentukan ketumpatan dengan mengambil nisbah kedua-dua parameter.
  • Isih item dalam susunan ketumpatan yang berkurangan.
  • Tambahkan nilai sehingga <=W.

Pendekatan Tamak untuk Menyelesaikan Masalah Knapsack Pecahan

Pendekatan tamak bertujuan untuk membuat pilihan yang ideal pada setiap langkah, yang membawa kepada penyelesaian yang ideal pada akhirnya. Ia menyelesaikan masalah langkah demi langkah yang membawa kepada kesimpulan dan bukannya menyimpulkan keputusan pada akhirnya sahaja. Ini ialah kod sumber untuk melaksanakan penyelesaian kepada masalah ransel pecahan dalam C++:



#include

menggunakan ruang nama std ;

struct Objek {

int nilai, berat ;


Objek ( int nilai, int berat badan )
: nilai ( nilai ) , berat ( berat badan )
{
}


} ;

bool cmp ( struct Objek x, struct Objek y )

{

berganda A1 = ( berganda ) x. nilai / x. berat badan ;

berganda A2 = ( berganda ) dan. nilai / dan. berat badan ;

kembali A1 > A2 ;

}

berganda pecahanKnapsack ( struct Objek arr [ ] ,
int DALAM, int saiz )
{

menyusun ( arr, arr + saiz, cmp ) ;


int curWeight = 0 ;

berganda nilai akhir = 0.0 ;


untuk ( int i = 0 ; i < saiz ; i ++ ) {

jika ( curWeight + arr [ i ] . berat badan <= DALAM ) {
curWeight + = arr [ i ] . berat badan ;
nilai akhir + = arr [ i ] . nilai ;
}


lain {
int kekal = DALAM - curWeight ;
nilai akhir + = arr [ i ] . nilai
* ( ( berganda ) kekal
/ arr [ i ] . berat badan ) ;

rehat ;
}
}

kembali nilai akhir ;


}

int dalam = 60 ;


Objek arr [ ] = { { 100 , dua puluh } ,
{ 380 , 40 } ,
{ 140 , 10 } ,
{ 180 , 30 } } ;

int saiz = saiz ( arr ) / saiz ( arr [ 0 ] ) ;


cout << 'Keuntungan maksimum = '

<< pecahanKnapsack ( arr, v, saiz ) ;

kembali 0 ;

}

Dalam kod ini, struktur objek ditakrifkan yang mempunyai berat dan nilai keuntungan yang disimpan di dalamnya. Bool cmp() digunakan untuk membuat perbandingan antara dua objek berdasarkan nisbah berat dan nilai dua objek. Tatasusunan disusun dalam tertib menurun dan nilai terus ditambah sehingga mencapai maksimum. Jika nilai semasa dibenarkan dan dalam had, ia akan ditambah, jika tidak, nisbah yang dikurangkan ditambah pada beg. Magnitud berat dan nilai adalah input dalam kod utama dan keuntungan maksimum dicetak pada output.





Keuntungan maksimum yang disimpan dalam makanan ringan ialah 580.



Kesimpulan

Masalah ransel pecahan dalam C++ merujuk kepada mengenal pasti cara untuk mengisi beg dengan item dengan berat tertentu dan untung dengan cara yang beg itu mengandungi nilai maksimum tanpa melebihi had maksimum. Ini boleh dicapai dengan pendekatan tamak yang bertujuan untuk membuat pilihan yang ideal pada setiap langkah, yang membawa kepada penyelesaian yang ideal pada akhirnya.