华为面试题求解析

小明装修需要n(1<=n<=200)颗钉子,但是五金店没有散装钉子卖,只有两种盒装包装的,一种包装4颗,一种包装有9颗,请问小明最少需要买多少盒钉子才能刚好买够n颗?

输入一个数字n,表示小明需要n颗钉子
输出一个数字,表示最少需要的盒数,如果不能刚好够n颗,则输出-1#华为##笔试题目##校招#
全部评论
动态规划,num[n] = min(num[n-4], num[n-9]) + 1, num[n]是装n个钉子需要的最少盒数
7 回复 分享
发布于 2019-09-06 15:19
import java.util.Scanner; public class Main1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); int min = -1; for (int i = n/9; i >=0 ; i--) { if((n-9*i)%4==0) { min=i+(n-9*i)/4; break; } } System.out.println(min); } }
4 回复 分享
发布于 2019-09-07 12:46
4x+9y=m x+y=n 欲令n最小: 4x+4y=4n,5y=m-4n,5x=9n-m 说白了就是先找最小的n使得m和4n关于5同余嘛,n%5==-m%5 最后记得检验一下x和y的正负关系就行了,有负的话n就调个5看看
点赞 回复 分享
发布于 2019-09-06 16:56
#include <iostream> #include <vector> using namespace std; class Solution { public: int buyNails(vector<int>& nails, int count) { vector<int> dp(count + 1, -1); dp[0] = 0; for (int i = 1; i <= count; i++) { for (int j = 0; j < nails.size(); j++) { if (i - nails[j] >= 0 && dp[i - nails[j]] != -1) { if (dp[i] == -1 || dp[i] > dp[i - nails[j]] + 1) dp[i] = dp[i - nails[j]] + 1; } } } return dp[count]; } }; int main() { vector<int> nails = { 4, 9 }; int n; cin >> n; Solution s; cout << s.buyNails(nails, n) << endl;; return 0; }
1 回复 分享
发布于 2019-09-06 17:03
leetcode换零钱吧,这题比那个还简单一点
点赞 回复 分享
发布于 2019-09-06 15:18
DP换硬币问题
点赞 回复 分享
发布于 2019-09-12 09:14
不用知道什么方法,直接除就好
点赞 回复 分享
发布于 2019-09-12 09:13
我当时没想到动态规划,用的广度优先搜索做的。这可以理解为一个无权图求最短路径的问题,不就是广度优先搜索嘛,用队列实现,同时避免重复访问。
点赞 回复 分享
发布于 2019-09-07 10:37
有点像辗转相除法
点赞 回复 分享
发布于 2019-09-06 17:20
简单dp
点赞 回复 分享
发布于 2019-09-06 15:54
贪心回溯或者动态规划都可以。动态规划可以参考leetcode322题。
点赞 回复 分享
发布于 2019-09-06 15:48
a=n%9 b=a%4 如果b为1,拆3个9来补整; 如果b为2,拆2个; 如果b为3,拆3个。
点赞 回复 分享
发布于 2019-09-06 15:45
动态规划
点赞 回复 分享
发布于 2019-09-06 15:36
背包问题扩展,自己好好想想吧
点赞 回复 分享
发布于 2019-09-06 15:35
暴力破解
点赞 回复 分享
发布于 2019-09-06 15:29
贪心就行了
点赞 回复 分享
发布于 2019-09-06 15:14
贪心回溯,或者简单点,用数学公式直接算出来
点赞 回复 分享
发布于 2019-09-06 15:12

相关推荐

投递美团等公司6个岗位
点赞 评论 收藏
分享
评论
1
21
分享

创作者周榜

更多
牛客网
牛客企业服务