//将物品安升序排序在进行背包处理效果会更好,如果能够先让01物品先背包处理在处理完全物品 效果更加明显 #define MAXN 205000 #define ANS -1 //背包数组初始化的值 int d[MAXN]; //背包数组 int v ; //背包容量 int maxcost; //背包当前最大容量 void Initpack() //初始化背包 { d[0]=0; for(int i=1; i<=v; i++) d[i]=ANS; } void ZeroOnePack(int cost,int weight)//cost 为费用, weight 为价值 { if(cost > v)return; int i=min(maxcost,v-cost); if(maxcost+cost>v) { while(d[i]==ANS) i--; if(d[cost+i]<d[i]+weight) d[cost+i]=d[i]+weight; maxcost = max(maxcost,cost+i); } else { d[maxcost+cost]=d[maxcost]+weight; maxcost+=cost; } for(;i>=0;i--) if(d[i]!=ANS && d[i+cost] < d[i] + weight) d[i+cost]=d[i]+weight; } void CompletePack(int cost,int weight) { if(cost > v) return; int i,t,j=v-cost; for(i=0;i<=j;i++) if(d[i]!=ANS && d[t=i+cost] < d[i]+weight) d[t]=d[i]+weight; maxcost = max(maxcost,t); }
转载于:https://www.cnblogs.com/codeloveme/archive/2012/08/03/2621876.html