From 6fec06d0053423f88ee3e84f675d556e10560103 Mon Sep 17 00:00:00 2001 From: Zydhan Linnar Putra Date: Mon, 8 Jun 2020 03:35:29 +0700 Subject: [PATCH] Add 07. Dynamic Programming : Knapsack --- .../07. Dynamic Programming/Knapsack.cpp | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Kompetitif Dasar/07. Dynamic Programming/Knapsack.cpp diff --git a/Kompetitif Dasar/07. Dynamic Programming/Knapsack.cpp b/Kompetitif Dasar/07. Dynamic Programming/Knapsack.cpp new file mode 100644 index 0000000..7b5e670 --- /dev/null +++ b/Kompetitif Dasar/07. Dynamic Programming/Knapsack.cpp @@ -0,0 +1,49 @@ +#include +using namespace std; +typedef pair pii; +int berat[101], harga[101], n_barang; +bool sudah[101][2001], ambil[101][2001]; +pii dp[101][2001]; +#define mpair make_pair + +pii compute(int barang, int kapasitas) { + if(barang == 0 || kapasitas == 0) + return mpair(0, kapasitas); + if(sudah[barang][kapasitas]) + return dp[barang][kapasitas]; + + pii best = compute(barang - 1, kapasitas); + ambil[barang][kapasitas] = false; + if(kapasitas >= berat[barang]) { + pii best2 = compute(barang - 1, kapasitas - berat[barang]); + best2.first += harga[barang]; + if(best2.first > best.first || (best2.first == best.first && best2.second > best.second)) + best = best2, ambil[barang][kapasitas] = true; + } + sudah[barang][kapasitas] = true; + dp[barang][kapasitas] = best; + return best; +} +set barangdiambil; +void print(int barang, int kapasitas) { + if(barang == 0) + return; + if(ambil[barang][kapasitas]) { + barangdiambil.insert(barang); + print(barang - 1, kapasitas - berat[barang]); + } else print(barang - 1, kapasitas); +} + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(NULL); + int kapasitas; + cin>>kapasitas>>n_barang; + for(int i=1; i<=n_barang; i++) + cin>>berat[i]>>harga[i]; + compute(n_barang, kapasitas); + print(n_barang, kapasitas); + for(auto i=barangdiambil.begin(); i != barangdiambil.end(); i++) + cout<<*i<<'\n'; + return 0; +} \ No newline at end of file