#include
#include
using namespace std; int n; double c; double v[100]; double w[100]; double cw = 0.0; double cv = 0.0; double MAX_put = 0.0; double ratio[100];//比率 int order[100]; int put[100]; void knapsack()//按比值进行排序 { int i,j; int temporder = 0; double temp = 0.0; for(i=1;i<=n;i++) ratio[i]=v[i]/w[i]; for(i=1;i<=n-1;i++) { for(j=i+1;j<=n;j++) if(ratio[i]
n)//i>n说明物品全都能被放入 { MAX_put = cv; return; } if(cw+w[i]<=c)//未到达极限容量 { cw+=w[i]; cv+=v[i]; put[i]=1; backtrack(i+1); cw-=w[i]; cv-=v[i]; } if(bound(i+1)>MAX_put) { put[i]=0; backtrack(i+1); } } double bound(int i) { double leftw= c-cw; double b = cv; while(i<=n&&w[i]<=leftw) { leftw-=w[i]; b+=v[i]; i++; } if(i<=n) b+=v[i]/w[i]*leftw; return b; } int main() { int i; cout<<"请输入物品数量及背包容量:"; cin>>n>>c; for(i=1;i<=n;i++) { cout<<"请输入第"<
>w[i]>>v[i]; order[i]=i; } knapsack(); backtrack(1); cout<<"最大价值为:"<
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176514.html原文链接:https://javaforall.net
