最少的硬币(线性规划)

来源:互联网 发布:0信誉淘宝店铺转让 编辑:程序博客网 时间:2024/06/01 07:16

现在我们有面值为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;}



0 0