面试题:有一个箱子容积为v,同时有n个物品,每个物品有一个体积。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。

面试题

有一个箱子容积为v,同时有n个物品,每个物品有一个体积。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。

输入

箱子的容积 v
物品个数 n
每个物品占的空间 x1,x2…xn

输出

最小剩余空间 s

解题思路

背包类动态规划问题,假设若当前背包现容纳体积为j,此时若将物品i放入到背包中则容器中容纳状态为dp[j-n[i]] + n[i],其中dp[j-n[i]]代表背包放置物品i之前的容量,n[i]就代表x1~xn中的某一个物品所占的空间,若该物品i未放入背包中,则容量状态不变为dp[j],由此可得出动态转移方程 dp[j] = max(dp[j],dp[j-n[i]] + n[i]),在此过程中需要遍历每一个物品找到最优解

  • 以下代码在最新C++规则中不支持,数组大小必须定义为常量,可通过指针类型new开辟数组,使用指针进行操作

题解

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vld.h>
using namespace std;
int main()
{
	int v,n;
	cout << "请输入体积:";
	cin >> v;
	cout << "请输入物品个数:";
	cin >> n;
	int box[n] = {};
	cout << "初始化物品体积:";
	for(int i = 0;i<n;i++)
	{
		cin >> box[i];
	}
	int dp[v+1] = {0};//表示容积为v时可放置物品的容量
	for(int i = 0;i < n; i++)
	{
		for(int j = v ;j > box[i]; j--)
		{
			dp[j] = max(dp[j],dp[j-box[i]] + box[i])
		}
	}
	cout<<v-dp[v];
	system("pause");
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值