#include<bits/stdc++.h>
using namespace std;
class Knap{
friend int Knapsack(int*,int*,int,int,Knap&);
public:
int c;
int n;
int* w;
int* p;
int cw;
int cp;
int bestp;
int *x,
*bestx;
int Bound(int i);
void Backtrack(int i);
};
int Knap::Bound(int i){
int cleft = c - cw;
int b = cp;
while(i<=n&&w[i]<=cleft){
b += p[i];
cleft -= w[i];
i++;
}
if(i<=n) b += cleft*(p[i]/w[i]);
return b;
}
void Knap::Backtrack(int i){
if(i>n){
bestp = cp;
for(int i=1;i<=n;i++){
bestx[i] = x[i];
}
for(int i=1;i<=n;i++){
cout<<bestx[i]<<" ";
}
cout<<" value "<<cp<<endl;
return;
}
else{
if(cw + w[i]<=c){
x[i] = 1;
cw += w[i];
cp += p[i];
Backtrack(i+1);
cw -= w[i];
cp -= p[i];
}
if(Bound(i+1) > bestp)
{
x[i] = 0;
Backtrack(i+1);
}
}
}
class Object{
friend int Knapsack(int*,int*,int,int,Knap&);
friend bool cmp(Object,Object);
private:
int id;
double aver;
};
bool cmp(Object a,Object b){
return a.aver>b.aver;
}
int Knapsack(int* w,int* p,int c,int n,Knap& K){
int W = 0;
int P = 0;
Object* Q = new Object[n];
for(int i=1;i<=n;i++){
Q[i-1].id = i;
Q[i-1].aver = 1.0*p[i]/w[i];
P += p[i];
W += w[i];
}
if(W<c) return P;
sort(Q,Q+n,cmp);
K.p = new int[n+1];
K.w = new int[n+1];
K.x = new int[n+1];
K.bestx = new int[n+1];
for(int i=1;i<=n;i++){
K.p[i] = p[Q[i-1].id];
K.w[i] = w[Q[i-1].id];
}
K.cp = 0; K.cw = 0; K.c = c; K.n = n; K.bestp = 0;
K.Backtrack(1);
delete [] Q; delete [] K.w; delete [] K.p;delete [] K.x;
return K.bestp;
}
void Init(int* &w,int* &p,int& c,int& n){
cout<<"input number of object and capacity of bag"<<endl;
cin>>n>>c;
w = new int[n+1];
p = new int[n+1];
cout<<"input weight of objects"<<endl;
for(int i=1;i<=n;i++){
cin>>w[i];
}
cout<<"input value of objects"<<endl;
for(int i=1;i<=n;i++){
cin>>p[i];
}
}
void Print(int bestp,int n,int*& x){
cout<<"max value is"<<endl;
cout<<bestp;
cout<<"The optimal solution is"<<endl;
for(int i=1;i<=n;i++){
cout<<x[i]<<" ";
}
}
int main(){
int *w=NULL,*p=NULL;
int c,n;
Knap K;
Init(w,p,c,n);
Print(Knapsack(w,p,c,n,K),n,K.bestx);
return 0;
}