Add 07. Dynamic Programming : Knapsack
parent
12a3482253
commit
6fec06d005
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue