AcWing 601. 小Q购物
原题链接
中等
作者:
lzxpig
,
2019-04-10 21:35:21
,
所有人可见
,
阅读 1379
贪心去凑
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
vector<int> coins(n);
for(int i = 0;i<n;i++){
cin>>coins[i];
}
int cur = 0; //当前的钱数
int cnt = 0; //需要的个数
int i = 0; //当前用第i个硬币
if(coins[0] != 1){//必须要有1的硬币
cout<<-1<<endl;
}
else{
while(cur<m){
while(i+1 < n && coins[i+1] <= cur+1){//凑的逻辑就是,不越界 && 当前的钱+1已经达到下一个硬币的面额,用下一个硬币来凑
i++;
}
cur+=coins[i];
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
应该没有吧
不好意思哈,是我看错了,是题解中有一个答案vector越界了
好的hh 哪个题解啊
这题贪心不行的,只有局部最优解,要用DP
受教了
这道题目的数据范围是 $O(10^9)$,DP会超时。贪心是可以的,从小到大凑,每次尽可能用不会产生“缝隙”的面额最大的硬币就可以了。详细做法可以参考 直播录像,从第16分钟开始。