Gambaran
Jawaban Jeff Shattock benar bahwa ini setara (atau isomorfik, seperti yang ditulis matematikawan) untuk masalah optimisasi kombinatorial, tetapi sama dengan masalah pengemasan bin 1 dimensi , bukan masalah ransel .
Beruntung bagi Anda, saya memiliki beberapa kode untuk dibagikan yang akan menyelesaikan masalah ini untuk Anda, atau siapa pun, dengan akses ke komputer Windows dengan setidaknya versi 3.5 dari .NET Framework diinstal.
Solusi Kasar
Pertama, unduh dan instal LINQPad .
Kedua, unduh kueri LINQPad yang baru saja saya tulis - inilah linq (ha) ke file mentah. Simpan sebagai file .linq dan buka di LINQPad.
Ubah parameter:
Inilah bagian dalam kode kueri LINQPad yang harus Anda ubah:
int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP.
string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";
Ubah binSizeMb
ke ukuran 'tempat sampah' Anda, mis. CD, DVD, mis. int binSizeMb = 650;
untuk CD.
Catatan - binSizeMb
nilai ditafsirkan sebagai apa yang kadang-kadang disebut sebagai mebibyte . Berlawanan dengan masa kecil saya, ketika semua kelipatan byte adalah 'biner', kadang-kadang 'MB' sekarang merujuk pada 'megabita desimal' atau tepatnya 1.000.000 byte, berbeda dengan 1.048.576 byte dari mebibyte (MiB), yang digunakan dalam kode saya . Jika Anda ingin mengubah ini, ubah baris const int bytesPerMb = 1048576;
dalam kode menjadi const int bytesPerMb = 1000000;
.
Ubah rootFileFolderPath
ke path lengkap folder yang berisi file yang ingin Anda 'masukkan ke dalam bins', mis. string rootFileFolderPath = @"C:\MySecretBinFilesFolder";
.
Jalankan kueri dengan menekan F5atau mengklik tombol Execute di kiri atas tab kueri.
Hasil
Kode permintaan akan menyebutkan semua file dalam rootFileFolderPath
folder, secara rekursif, yang berarti akan menyertakan file di semua subfolder juga.
Maka itu akan membuat 'sampah' untuk file sehingga ukuran total semua file di setiap bin kurang dari atau sama dengan ukuran bin yang ditentukan.
Di panel hasil LINQPad Anda akan melihat dua daftar.
Daftar pertama adalah dari semua file yang ditemukannya, terdaftar dalam urutan menurun berdasarkan ukuran.
Daftar kedua adalah tempat sampah yang dibuat dengan 'mengemas file', dengan daftar file dan ukurannya, serta ukuran sampah yang tersisa.
Berikut screenshot yang menunjukkan daftar kedua dan dua nampan pertama dibuat:
Analisis Sepintas
Menurut Wikipedia, algoritma yang saya gunakan - strategi First Fit Decreasing (FFD) - tidak boleh terlalu buruk; Negara Wikipedia:
Pada 2007, terbukti bahwa 11/9 OPT + 6/9 terikat untuk FFD ketat.
'OPT' mengacu pada strategi optimal (sebagai sesuatu yang berpotensi tidak dapat dijangkau, bukan strategi aktual tertentu).
Berdasarkan ingatan saya yang agak kabur dari istilah matematika yang terlibat, ini harus berarti bahwa strategi FFD harus, paling buruk, mengemas item menjadi ~ 1,22 kali jumlah tempat sampah yang strategi optimal akan. Jadi, strategi ini mungkin mengemas item menjadi 5 nampan bukan 4. Saya curiga kinerjanya cenderung sangat dekat dengan yang optimal kecuali untuk ukuran item 'patologis' tertentu.
Artikel Wikipedia yang sama juga menyatakan bahwa ada "algoritma yang tepat" . Saya mungkin memutuskan untuk mengimplementasikannya juga. Saya harus membaca makalah yang menjelaskan algoritma terlebih dahulu.