最少数量货物装箱问题

最少数量货物装箱问题

http://www.nowcoder.com/questionTerminal/37aa8a88a72e47f798a14d63bee61d8f

题目难度:二星
考察点:动态规划

方法1:暴力

1. 分析:

这道题类似于完全背包问题,每个货物都可以无限使用,但是要求背包必须装满,而且要求背包中的物品数目最少。由于货物是无限的,那么假设dp[n]表示背包容量为n的能够装满的最少货物个数,如果选择3, 5, 7任意的一种货物重量,那么dp[n-3]、dp[n-5]、dp[n-7]就会是背包容量为n的一种选择,所以问题就转化为了求dp[n-x],其中x=3、5、7,那么这就是一个递归求解的问题。
举个例子:n=8,求dp[8]
那么dp[8] = min(dp[8-3], dp[8-5], dp[8-7]) + 1 = min(dp[5], dp[3], dp[1]) + 1
其中dp[5] = min(dp[5-3], dp[5-5]) + 1 = min(dp[2], dp[0]) + 1 = 1
其中dp[3] = dp[3-3] + 1 = dp[0] + 1 = 1
在递归回去得到dp[8] = min(1, 1, INF) + 1 = 2,所以dp[8] = 2

2. 复杂度分析:

时间复杂度:O(n^3)
空间复杂度:O(1)


3. 代码:

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int dfs(int x) {
 if(x == 0) return 0;
 if(x < 0) return INF;
 int ans = INF;
 ans = min(dfs(x-3), min(dfs(x-5), dfs(x-7)))+1;
 return ans;
}
int main() {
 int n;  cin>>n;
 int ans = dfs(n);
 cout<<(ans>=INF?-1:ans)<<endl;
 return 0;
}

方法2:动态规划

1. 分析:

由于上述递归的复杂度太高,我们可以采用动态规划的算法来进行考虑,即把上述的递归改成递推,递推方程已经在上述的方法中列出来了,即dp[i] = min(min(dp[i-3],dp[i-5]),dp[i-7])+1,所以直接进行计算,最后输出dp[n]即可。

算法实现:
(1). 输入背包容量n
(2). 预处理dp数组为最大值
(3). 预处理i=3,5,,6,7的时候dp[i]的值,即 dp[3] = dp[5] = dp[7] = 1, dp[6] = 2;
(4). 根据递推方程进行遍历求解,最后输出结果dp[n]

2. 复杂度分析:

时间复杂度:O(n)
空间复杂度:O(n)


3. 代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+5;
int dp[MAXN];
int main() {
 int n; cin>>n;
 for(int i=1; i<=n; i++) dp[i] = n+1;
 dp[3] = dp[5] = dp[7] = 1;
 dp[6] = 2;
 for(int i=8; i<=n; i++) dp[i] = min(min(dp[i-3],dp[i-5]),dp[i-7])+1;
 cout<<(dp[n]==n+1?-1:dp[n])<<endl;
 return 0;
}
全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务