混合三种背包问题
思路:
1.如果s[i] == 0,这件物品可以使用无限次——可以转化成多重背包问题
多重背包问题
2.如果是s[i] == -1,这件物品只能使用一次——可以转化为0-1背包问题
0-1背包
3.其它情况是每个物品给了确定的个数——可以转化成完全背包问题
完全背包问题
public class Main {
int N; //物品的种数为N
int V; //背包的容量为V
public int mixBag(int[] v, int[] w, int[] s){
int[] dp = new int[V + 1];
for(int i = 0; i < N; i++){
if(s[i] == 0){ //可以使用无限次
for(int j = v[i]; j <= V; j++){
dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);
}
}
else if(s[i] == -1){ //只能使用一次
for(int j = V; j >= v[i]; j--){
dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);
}
}
else{ //有确定的使用次数
for(int j = V; j >= 0; j--){
for(int k = 0; k <= s[i] && k * v[i] <= j; k++){
dp[j] = Math.max(dp[j], dp[j - k * v[i]] + k * w[i]);
}
}
}
}
return dp[V];
}
}