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<iostream>
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<<f[n]<<endl;
delete [] f;
return 0;
}
第1题则是按照如果当前的硬币是a[j]组成了钱n元,那么下面的f[i]=f[i]+f[i-a[j]],
#include<iostream>
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<<f[n]<<endl;
delete [] f;
return 0;
}