[算法课]从超简单贪心而来的几个奇怪又好用的写法 原创
题目来源:网络
算法标签:贪心
题目简介
兑换N元的零钱,使得给出的钞票数量最小
思路
毫无疑问递归访问最大,但这一点都不重要,重要的是我觉得几个写法非常有趣
#include<iostream>
using namespace std;
int m[]={100,50,20,10,5,2,1};
const int num = sizeof m /sizeof m[0];//静态得到数组M的大小
int z[num];//直接申请M大小的空间
int main()
{
int n;
cin>>n;
for(int i=0;i<num;i++)z[i]=n/m[i],n%=m[i];
for(auto op:z)cout<<op<<" ";
return 0;
}
//省空间
#include<iostream>
using namespace std;
int m[]={100,50,20,10,5,2,1};
int main()
{
int n;
cin>>n;
for(int i=0;i<sizeof m/sizeof m[0];i++){cout<<n/m[i]<<" ";n%=m[i];}//直接用不用申请空间解决战斗,一边输出答案一边算余值
return 0;
}
//递归
#include<iostream>
using namespace std;
int m[] = { 100,50,20,10,5,2,1 };
void func(int n, int i, int len)
{
if (n&&i < len)func(n%m[i], i + 1, len);//这里事实上是回溯输出,所以是反序 有意思的其实是余数的递归,数量的输出
cout << n / m[i] << " ";
}
int main()
{
int n, len = sizeof m / sizeof m[0] - 1;
cin >> n;
func(n, 0, len);
return 0;
}

浙公网安备 33010602011771号