[算法课]从超简单贪心而来的几个奇怪又好用的写法 原创

题目来源:网络

算法标签:贪心

题目简介

兑换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;
}
posted @ 2023-10-27 21:31  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源