题目描述:
(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);
}
}