现在我们有面值为1,3,5元的硬币若干枚,想要用最少的硬币个数凑够n元。
这是一个线性规划的问题。
既然是线性规划,就要定义状态,并推算出状态转移方程。
定义状态f[i]为凑够i元需要的最少的硬币数。
这里用顺推,从i=0开始,不需要硬币来凑,f[0]=0。
i=1,f[1]=f[1-1]+1=f[0]+1=1;
i=2,f[2]=f[2-1]+1=f[1]+1=2;
i=3,(注意这里开始不一样了,因为存在面值为3的硬币)。如果还按前面的做法,得到f[3]=f[3-1]+1=f[2]+1=3。但是这里有另一种可能,也就是用面值为3的硬币,容易得到f[3]=1。而题目要求是用最少的硬币,显然第二种更符合,所以f[3]=1。
i=4,f[4]=f[4-1]+1=f[3]+1=2。
同样的,当i=5的时候,就应该考虑还有面值为5 的硬币。f[5]=f[5-1]+1=f[4]+1=3。如果用面值为5 的硬币,容易得到f[5]=1。
…………
以此类推能够得到状态转移方程,f[i]=min{f[i-vj]+1};vj<=i。
Talk is cheap,show the code.
#include<stdio.h>
int main()
{
int f[1005],n;
while(scanf("%d",&n)==1)
{
f[0]=0;
for(int i=1;i<=1000;i++)
{
int minn=0x3f3f3f;
for(int j=1;j<=5;j+=2)
{
if(minn>f[i-j]+1)
{
minn=f[i-j]+1;
}
}
f[i]=minn;
}
printf("%d\n",f[n]);
}
return 0;
}