#include<iostream>
#include<algorithm>
using namespace std;
class Knap {
friend int knapsack(int *,int *,int ,int);
private:
float Bound(int i);
void Backtrack(int i);
int c;
int n;
int *w;
int *p;
int cw;
int cp;
int bestp;
};
void Knap::Backtrack(int i) {
if (i > n) {
bestp = cp;
return;
}
if (cw + w[i] <= c) {
cw += w[i];
cp += p[i];
Backtrack(i + 1);
cw -= w[i];
cp -= p[i];
}
if (Bound(i + 1) > bestp) {
Backtrack(i + 1);
}
}
float Knap::Bound(int i) {
int cleft = c - cw;
float b = cp;
while (i <= n && w[i] <= cleft) {
cleft -= w[i];
b += p[i];
i++;
}
if (i <= n){
float aa=p[i] * cleft;
float bb=w[i];
float temp=aa/bb;
b += temp;
cout<<b<<endl;
}
return b;
};
class Object {
friend int knapsack(int *,int *,int,int);
public:
int operator<=(Object a) const {
return (d >= a.d);
}
private:
int ID;
float d;
};
int knapsack(int p[], int w[], int c, int n) {
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].d = 1.0 * p[i]/w[i];
P += p[i];
W += w[i];
}
if (W <= c) return P;
for(int i = 1; i<n; i++)
for(int j = 1; j<= n-i; j++)
{
if(Q[j-1].d < Q[j].d)
{
Object temp = Q[j-1];
Q[j-1] = Q[j];
Q[j] = temp;
}
}
Knap K;
K.p = new int[n + 1];
K.w = 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;
return K.bestp;
}
int main(){
int p[]={0,5,3,5,3,2};
int w[]={0,6,5,4,2,1};
int c=knapsack(p,w,10,5);
cout<<"01背包问题的最有值为:"<<c;
return 0;
}