满意答案
#include
#include
using namespace std;
#define N 100
class
HeapNode
{
public:
double upper,price,weight;
int level,x[N];
};
double MaxBound(int i);
double Knap();
void AddLiveNode(double up,double cp,double cw,bool ch,int level);
stackHigh;
double w[N],p[N];
double cw,cp,c=7;
int n=4;
int main()
{
int i;
for(i=1;i<=n;i++)
cin>>w[i];
for(i=1;i<=n;i++)
cin>>p[i];
cout<
cout<
return 0;}
double MaxBound(int j)
{
double left=c-cw,b=cp;
while(j<=n&&w[j]<=left)
{
left-=w[j];
b+=p[j];
j++;
}
if(j<=n)
b+=p[j]/w[j]*left;
return b;
}
void AddLiveNode(double up,double cp,double cw,bool ch,int lev)
{
HeapNode be;
be.upper=up;
be.price=cp;
be.weight=cw;
be.level=lev;
if(lev<=n)
High.push(be);
}
double Knap()
{ int i=1; cw=cp=0; double
bestp=0,up=MaxBound(1);
while(1)
{ double wt=cw+w[i];
if(wt<=c)
{ if(cp+p[i]>bestp) bestp=cp+p[i];
AddLiveNode(up,cp+p[i],cw+w[i],true,i+1);
}
up=MaxBound(i+1);
if(up>=bestp)
AddLiveNode(up,cp,cw,false,i+1);
if(High.empty()) return bestp;
HeapNode node=High.top();
High.pop(); cw=node.weight; cp=node.price; up=node.upper;
i=node.level;
}
}
10分享举报