背包问题_模板
01背包的处理过程
int a[1005]={0};//全局数组 void zeroonepack(int T,int t,int p){//总容量,单件物品消耗,单件价值 for(int i=T;i>=t;i--){ a[i]=max(a[i],a[i-t]+p); } }
完全背包:
int a[1005]={0}; void completepack(int T,int t,int p){ for(int i=t;i<=T;i++){ a[i]=max(a[i],a[i-t]+p); } }
多重背包:
int a[1005]; void zeroonepack(int T,int t,int p){//总容量,单件物品消耗,单件价值 for(int i=T;i>=t;i--){ a[i]=max(a[i],a[i-t]+p); } } void completepack(int T,int t,int p){//总容量,单件物品消耗,单件价值 for(int i=t;i<=T;i++){ a[i]=max(a[i],a[i-t]+p); } } void multiplepack(int V,int v,int w,int m){//总容量,单件物品消耗,单件价值,物品数量 int k; if(v*m>=V){ completepack(V,v,w); return ; } k=1; while(k<=m){ zeroonepack(V,k*v,k*w); m=m-k; k*=2; } zeroonepack(V,v*m,w*m); }