问题:假定我们有1元、3元、5元硬币若干,问如何使用最少的硬币数目得到n元钱?
动态规划法
1.理解动态规划算法“自下而上”的设计思路
2.找到描述问题的状态量和状态转移方程
3.用动态规划算法解决硬币问题
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
int max,i,j;
int value[3]={1,3,5};
scanf("%d",&max);
int F[2000];
memset(F,0x3f,sizeof(F));
F[0]=0;
for(i=1;i<=max;i++){
for(j=0;j<3;j++){
if(value[j]<=i&&F[i-value[j]]+1<F[i])
F[i]=F[i-value[j]]+1;
}
}
printf("%d\n",F[max]);
}
return 0;
}
运行效果:
另一种方法:
#include <stdio.h>
int main()
{
int money[6]= {5,3,1},n;
while(~scanf("%d",&n))
{
int ans = 0,salary = 0;
while(n--)
{
scanf("%d",&salary);
for(int i=0; i<3; i++)
if(salary/money[i])
ans+=salary/money[i],salary%=money[i];
}
printf("%d\n",ans);
}
return 0;
}