2019阿里校招在线笔试 —— 编程题第二题(装包裹)

1 篇文章 0 订阅
0 篇文章 0 订阅

忘记存原题了,不过题目数据倒是还记得

题目大致描述:

你拥有一个购物车免单机会,免单商品通过包裹派送,但快递限制了包裹的最大体积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;
	}

找到原题后会后续更新,希望有大佬还存着第一题的代码,教教我数兔子,数的我脑阔疼


笔者水平有限,若有错误欢迎纠正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值