硬币找零问题的变种

55 篇文章 0 订阅
探讨了硬币找零问题的一个变化形式,不再要求恰好等于给定金额,而是允许找零金额大于等于目标金额。文章通过动态规划的方法进行了解决方案的阐述。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述

硬币找零问题

区别在哪?

这里不需要等于amount,可以>=amount

动态规划解:

//不对
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
	// write your code here

        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext())
        {
            int n=scanner.nextInt();
            int m=scanner.nextInt();

            int a[]=new int[n+1];
            int b[]=new int[n+1];
            for(int i=0;i<n;i++)
            {
                a[i+1]=scanner.nextInt();
            }
            for(int i=0;i<n;i++)
            {
                b[i+1]=scanner.nextInt();
            }

            int f[][]=new int[n+1][m+1];




            for(int i=1;i<=m;i++)
            {
                if(a[1]>i)
                {
                    f[1][i]=Integer.MAX_VALUE;
                }
                else
                {
                    if(i%a[1]!=0)
                    {
                        f[1][i]=i/a[1]+1;//和硬币找零不相同
                    }
                    else
                    {
                        f[1][i]=i/a[1];
                    }

                }
            }

            for(int i=0;i<=n;i++)
            {
                f[i][0]=0;
            }

            for(int i=2;i<=n;i++)//不要从f[0][m]开始算 f[1][m]=min{f[0][m], ,,,,}不成立
            {
                for(int j=0;j<=m;j++)
                {
                    int min=Integer.MAX_VALUE;
                    for(int q=0;q<=b[i]&&q<=j/a[i];q++)
                    {

                        //System.out.println(i+"***"+q+":"+(f[i-1][j-q*a[i]]+q));
                        if(f[i-1][j-q*a[i]]!=Integer.MAX_VALUE&&min>f[i-1][j-q*a[i]]+q)
                        {
                            min=f[i-1][j-q*a[i]]+q;

                        }

                    }
                    f[i][j]=min;

                }



            }

            System.out.println(f[n][m]);
        }
    }
}
//但是m这里太大,空间复杂度太高,利用贪心。
//每次选择最大的,就可以直接找到最小钱币数大于amount

//题目延伸

//求集合中大于某个阈值的最小值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值