找零钱问题

1、给你六种面额1、2、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。

2、给你六种面额1、2、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的硬币个数最小。


上面是一个问题的两个变种

先看第二个

要是当前的硬币最少就是前面的硬币最少状态方程为f[n]=min(f[n-a[i]]+1,f[i]);

#include
using namespace std;
int main()
{
	int a[7]={1,2,5,10,20,50,100};
	int n;
	cin>>n;
	int* f=new int[n+1];
	for(int i=0;i<=n;i++)
		f[i]=INT_MAX;
	f[0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<7;j++)
			if(i>=a[j])
				f[i]=min(f[i-a[j]]+1,f[i]);
	}
	cout<

第1题则是按照如果当前的硬币是a[j]组成了钱n元,那么下面的f[i]=f[i]+f[i-a[j]],

#include
using namespace std;
int main()
{
	int a[7]={1,2,5,10,20,50,100};
	int n;
	cin>>n;
	int* f=new int[n+1];
	for(int i=0;i<=n;i++)
		f[i]=0;
	f[0]=1;
	for(int j=0;j<7;j++)
	{
		for(int i=1;i<=n;i++)
			if(i>=a[j])
				f[i]+=f[i-a[j]];
	}
	cout<



你可能感兴趣的:(笔试题)