最少的硬币(线性规划)

现在我们有面值为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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值