去哪儿。编程第二题,怎么做啊,求解答。

题目意思是,输入n个int数,[0,n-2]表示n-1个酒店的每晚价格,第[n-1]个元素是你拥有的钱。
要求输出,能住最少的天数,且钱必须刚好花完。
若不存在匹配情况,则返回-1.
#去哪儿#
全部评论
参考博客 http://blog.csdn.net/jiejinquanil/article/details/52684449
点赞
送花
回复
分享
发布于 2016-09-27 21:13
可以搜一下“完全背包”看一看
点赞
送花
回复
分享
发布于 2016-09-27 15:24
秋招专场
校招火热招聘中
官网直投
为什么是最少天数而不是最多天数。。
点赞
送花
回复
分享
发布于 2016-09-27 15:25
用dfs过了。。
点赞
送花
回复
分享
发布于 2016-09-27 15:27
http://blog.csdn.net/kangroger/article/details/36036101,,,这个你懂了,就会做去哪网的题了
点赞
送花
回复
分享
发布于 2016-09-27 15:32
是个动态规划问题,只用贪心可以过83%
点赞
送花
回复
分享
发布于 2016-09-27 15:38
这不就是一个数组中最少数之和等于最后一个元素的问题吗!
点赞
送花
回复
分享
发布于 2016-09-27 15:42
完全背包 HDU1114,有很多题解,百度一下。
点赞
送花
回复
分享
发布于 2016-09-27 15:56
67%没办法完美
点赞
送花
回复
分享
发布于 2016-09-27 15:57
package qunar; import java.util.Scanner; public class Main2 { static int rel =9999; public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); String s; while(in.hasNext()){ s = in.nextLine(); rel = 9999; gs(s); if(rel != 9999){ System.out.println(rel); }else{ System.out.println("-1"); } } } public static void gs(String s){ String[] ar = s.split(" "); int n = ar.length; int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = Integer.valueOf(ar[i]); } dp(arr,n-2,arr[n-1],0); } public static void dp(int[] arr,int now,int money,int day){ if(money < 0){ return; } if(money == 0){ if(day < rel){ rel = day; return ; } } if(money%arr[now] == 0){ if(money/arr[now] < rel){ rel = money/arr[now]+day; return; } }else{ for(int i=now;i>=0;i--){ if(money>=arr[i]){ dp(arr,i,money-arr[i],day+1); } } } } } 有一些多余的地方
点赞
送花
回复
分享
发布于 2016-09-27 16:06
可不可以住重复的酒店
点赞
送花
回复
分享
发布于 2016-09-27 16:16
可以使用递归来解决,AC83%
点赞
送花
回复
分享
发布于 2016-09-27 16:33
楼主收到面试通知了吗,据说当天就给,第二天就面
点赞
送花
回复
分享
发布于 2016-09-27 17:48
找钱问题
点赞
送花
回复
分享
发布于 2016-09-27 18:42
有兄弟收到面试通知没
点赞
送花
回复
分享
发布于 2016-09-27 18:55
确实是 找钱问题,参考了下,感觉现在应该没问题,好像还不用排序。 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; vector<int> v; int money; while (cin >> n) { v.push_back(n); } money = v[v.size() - 1]; v.pop_back(); //sort(v.begin(), v.end()); int length = v.size(); int *days = new int[money + 1]; int *value = new int[money + 1]; days[0] = 0; for (int i = 1; i <= money; i++) { int min = i; int used = 0; for (int j = 0; j < length; j++) { if (i >=v[j]) { if (days[i - v[j]] + 1 <= min && (i == v[j] || value[i - v[j]] != 0)) { min = days[i - v[j]] + 1; used = v[j]; } } } days[i] = min; value[i] = used; } if (value[money] == 0) cout << -1 << endl; else cout << days[money] << endl; //system("pause"); return 0; }
点赞
送花
回复
分享
发布于 2016-09-27 21:24
贪心算法,AC83%: #include <iostream> #include <vector> #include <algorithm>   #include <string> #include <sstream> using namespace std; bool SortByM1(const int &v1, const int &v2)  { return v1 > v2; } //main int main(){ vector<int> vecPrice; int nMoney; int nTemp; int nCount = 0; int nCurrentNumber = 0; string strLine;  getline(cin, strLine);  stringstream iss(strLine);  for (int i; iss >> i; vecPrice.push_back(i)); nMoney = vecPrice.back(); vecPrice.pop_back(); //降序排列 sort(vecPrice.begin(), vecPrice.end(), SortByM1); vector<int>::const_iterator iter = vecPrice.begin(); for (; iter != vecPrice.end(); iter++){ nCurrentNumber = *iter; while (nCurrentNumber<=nMoney) //贪心算法 { nCount++; nMoney -= nCurrentNumber; } if (nMoney==0) { break; } } if (nCount==0||nMoney>0) cout << "-1" << endl; else    cout << nCount << endl; }
点赞
送花
回复
分享
发布于 2016-09-27 21:37
贪心AC了
点赞
送花
回复
分享
发布于 2016-09-27 21:40
参考大神的,改了改 贪心或者说是dfs,只要不超时,应该全AC #include<iostream> #include<vector> #include<algorithm> using namespace std; int res = 0x7fffffff; void dfs(vector<int> v, int money, int k, int n) { if (money == 0) { res = res>k?k:res; return; } if (money < 0 || n < 0 || k > res) return; for (int i = money / v[n]; i >= 0; i--) dfs(v, money - i * v[n], k + i, n - 1); } int main() { int n; vector<int> v; int money; while (cin >> n) { v.push_back(n); } money = v[v.size() - 1]; v.pop_back(); sort(v.begin(), v.end()); int days = 0; dfs(v, money, 0, v.size()-1); if (res == 0x7fffffff) res = -1; cout << res; //system("pause"); return 0; }
点赞
送花
回复
分享
发布于 2016-09-28 19:26
public class Main4 { static Integer res = Integer.MAX_VALUE; public static void main(String[] args) { int[] n = {1,2,3,4,6,2,5,6}; ArrayList<Integer> list = new ArrayList<>(); f(n,0,0,0); System.out.println(res); } private static void f(int[] n, int idx, int tmp, int tmpr){ if(tmp == n[n.length - 1] && tmpr < res){ res = tmpr; } if(tmp > n[n.length - 1] || idx == n.length - 2){ return; } if(idx + 1 < n.length - 1){ f(n,idx + 1, tmp, tmpr); f(n,idx + 1, tmp += n[idx], tmpr + 1); } } }
点赞
送花
回复
分享
发布于 2016-09-29 19:09

相关推荐

整体时间线:2月末力扣从零开始。3月初刷题成瘾,中旬陆续开面开杀,被机试折磨,下旬纠结日常offer选择。4月入职淘天,从硬landing到上手业务快乐融入5月平静美好,顺利到我觉得直接转正是最佳选择,月底转暑期流程被hr直接挂,主管诱骗能转正,万幸蚂蚁暑期流程没拒掉,压哨发意向,手里也还有个腾讯offer兜底,毁约腾讯暑期到此结束。==============================一些感悟:永远保留后手,先拿了阿里国际日常,拿到网易伏羲offer之后才拒绝意向,中间难免要催hr尽量开在同一时间,后续等淘天oc的时候立马拒了网易意向。不会让手里超过2个offer,但是也不会在未确定的时候就拒掉到手的。在淘天的时候师兄主管都保证能转正别担心,甚至主管拉我进内部群一起团建,但是始终把腾讯offer抓在手里,也给了我撕破脸之后和主管谈判的底气。蚂蚁一面二面间隔一个半月,时不时反向保温一下面试官又没拒掉流程,真是我最明智的选择。==============================实习体验:研一在鹅厂AI&nbsp;Lab实习打杂纯快乐的,自己包装一下也是有产出的。遇到的所有人都很温和有礼貌,整体不卷年纪偏大,公司关怀好,不考虑城市的话应该会是第一选择。淘天业务组非常业务,技术不容易提升但是容易有产出,整体强度能承受分到的活也不多还挺核心的,师兄还是很nice的,往年转正待遇也挺好,小组整体年龄结构有中有小没老人,晋升空间不错。拒掉的offer里面,同花顺是做大模型部署加速的,给钱少太卷拒了;阿里国际是研究型实习生随便面的感觉面试官技术没有太懂;网易伏羲是llm+智能npc其实很有搞头,还是贪图大厂title拒了;腾讯这个最可惜,agent+游戏ai,而且在大部门实习过可以丝滑landing,腾讯招聘经常能看到校招社招广告,应该是团队扩张期,考虑到城市因素忍痛拒绝,释放一个hc给大家。==============================彩蛋:想看看牛u会做什么选择,感觉人生到了这个时间点,每个决策都会影响很大,已知和女友都是浙江人,她稳定杭州工作,计划后续杭州定居结婚。 #暑期实习# #腾讯# #阿里# #蚂蚁# #大模型# #淘天#
投递蚂蚁集团等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务