int v; //v为背包容量
int dp[1010]; //应当注意dp数组的初始化
void ZeroOnePack(int cost, int val){ //cost为花费, val为价值
for(int i=v; i>=cost; i--)
dp[i] = max(dp[i], dp[i-cost]+val);
}
void CompletePack(int cost, int val){
for(int i=cost; i<=v; i++)
dp[i] = max(dp[i], dp[i-cost]+val);
}
void MultiplePack(int cost, int val, int cnt){ //cnt为数量
if(cost*cnt>=v)
CompletePack(cost, val);
else{
for(int i=1; i<=cnt; i=i<<1){ //二进制分解cnt
ZeroOnePack(cost*i, val*i);
cnt-=i;
}
if(cnt>0)
ZeroOnePack(cost*cnt, cnt*val);
}
}
以上写法我也不知道出处是哪,看了很多博客都是这样写的,我也试了用这个模板写了几个简单的题目,都过了。当然,模板毕竟是模板,是否可行,关键还是要视题目情况而定