1 //每件物品只能使用一次 2 void onezeropack(int v,int c) 3 { 4 int j; 5 for(j=val; j>=v; j--) 6 { 7 f[j]=max(f[j-v]+c,f[j]); 8 } 9 } 10 //每件物品可以无限使用 11 void completepack(int v,int c) 12 { 13 int j; 14 for(j=v; j<=val; j++) 15 { 16 f[j]=max(f[j-v]+c,f[j]); 17 } 18 } 19 //每件物品有限次使用 20 void multiplepack(int v,int c,int num) 21 { 22 if(c*num>=val) 23 { 24 completepack(v,c); 25 return; 26 } 27 int k=1; 28 while(k<num) 29 { 30 onezeropack(k*v,k*c); 31 num=num-k; 32 k=k*2; 33 } 34 onezeropack(num*v,num*c); 35 }
注意 : 背包的第一重循环要自己写
for(int i = 0 ;i < n ; i++)
调用其中一个函数
f[N]为dp数组
时间: 2024-10-12 21:13:14