拼凑面额

题目描述:
(1)给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();

        int[] m = {1, 5, 10, 20, 50, 100}; // 保存基本面额的数组
        long[] data = new long[num+1]; // 保存计算数据的数组
        for(int i = 0; i <= num; i++) // 边界条件A(n,1) = 1 (n>=0)
            data[i] = 1;
        for(int i = 1; i < 6; i++) // 基本面额从5开始,因为1元情况在数组初始化时已经写入了
            for(int n = 1; n <= num; n++) // n从1开始,保证了边界条件A(0,m)=1 (m=1,5,10,20,50,100)
                if(n >= m[i])
                    data[n] += data[n - m[i]]; // 状态转移方程
        System.out.println(data[num]);
        in.close();
    }
}

或者

import java.util.Scanner;
import java.util.Arrays;
public class Main{
    public static long count(int n){
        if(n <= 0)return 0;
        int[] coins = new int[]{1,5,10,20,50,100};
        long[] dp = new long[n+1];
        dp[0] = 1;
        for(int i = 0; i < coins.length; i++) {
        for(int j = coins[i]; j <= n; j++) {
        dp[j] = dp[j] + dp[j - coins[i]];//类似斐波那契 后者的种类数基于前者
        }
    }
    return dp[n];
    }
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            long res=count(n);
            System.out.println(res);
        }
    }
}

这里写图片描述
(2)给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] height = new int[n];
        for(int i =0;i<n;i++){
            height[i] = sc.nextInt();
        }
        int maxArea = -1;
        for(int i = 0;i<n;i++){
            int left=i;
            int right=i;
          //计算以当前值为最小高度的矩形面积
            while(left > 0 && height[left-1] >= height[i])      
                left--;//寻找左边界
            while(right < n-1 && height[right+1] >= height[i])  
                right++;//寻找右边界
            int tempArea = (right-left+1) * height[i];
            if(maxArea<tempArea) 
                maxArea=tempArea;
        }
        System.out.println(maxArea);
    }
}

最长连续字串:(3)给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        int maxlength=0;
        for(int i=0;i<s1.length();i++){
            for(int j=i;j<s1.length();j++){
                String tmp=s1.substring(i,j+1);
                if(s2.indexOf(tmp)!=-1){
                    maxlength=Math.max(maxlength,tmp.length());
                }
            }
        }
        System.out.println(maxlength);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值