Add 07. Dynamic Programming : Knapsack

master
Zydhan Linnar Putra 2020-06-08 03:35:29 +07:00
parent 12a3482253
commit 6fec06d005
1 changed files with 49 additions and 0 deletions

View File

@ -0,0 +1,49 @@
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> 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<int> 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;
}