忘记存原题了,不过题目数据倒是还记得
题目大致描述:
你拥有一个购物车免单机会,免单商品通过包裹派送,但快递限制了包裹的最大体积V和最大重量W
有若干种商品,每个商品都有4个参数体积Vi、重量Wi、价值Pi、商品数量Ci、商品种类Ti
(商品种类总4种:1、2、3、4,但已知1和3不能同时打包)
计算出在不超出限制的最大免单价值
思路:
分组背包
对于前两个约束(体积、重量)01背包就行。因为1和3商品类型冲突,分组背包,其实也就2组
由于没存原题,这里就直接贴方法代码了
private static int totalPrice(int categoryCount, int totalVolume, int totalWeight, int[] volume, int[] weight,
int[] stock, int[] price, int[] itemType) {
// categoryCount --- 商品数量
// totalVolume --- 最大体积
// totalWeight --- 最大重量
// volume --- 商品体积数组
// weight --- 商品重量数组
// stock --- 商品数量数组
// price --- 商品价值数组
// itemType --- 商品类型数组
/*
* dp[i][j][0] 体积为i,重量为j时,不存在类型1包裹的最大价值
* dp[i][j][1] 体积为i,重量为j时,不存在类型3包裹的最大价值
*
* */
int dp[][][] = new int[totalVolume + 1][totalWeight + 1][2];
for (int i = 1; i <= categoryCount; i++) {
if (itemType[i] == 1) {
continue;
}
int stock_len = stock[i];
while (stock_len > 0) {
stock_len--;
for (int j = totalVolume; j >= volume[i]; j--) {
for (int k = totalWeight; k >= weight[i]; k--) {
if (dp[j - volume[i]][k - weight[i]][0] + price[i] > dp[j][k][0]) {
dp[j][k][0] = dp[j - volume[i]][k - weight[i]][0] + price[i];
}
}
}
}
}
for (int i = 1; i <= categoryCount; i++) {
if (itemType[i] == 3) {
continue;
}
int stock_len = stock[i];
while (stock_len > 0) {
stock_len--;
for (int j = totalVolume; j >= volume[i]; j--) {
for (int k = totalWeight; k >= weight[i]; k--) {
if (dp[j - volume[i]][k - weight[i]][1] + price[i] > dp[j][k][1]) {
dp[j][k][1] = dp[j - volume[i]][k - weight[i]][1] + price[i];
}
}
}
}
}
int result = Math.max(dp[totalVolume][totalWeight][0], dp[totalVolume][totalWeight][1]);
return result;
}
找到原题后会后续更新,希望有大佬还存着第一题的代码,教教我数兔子,数的我脑阔疼
笔者水平有限,若有错误欢迎纠正