牛客网校招校招题目收集 ---- 编程题

某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来购买一批商品,求有多少种购买组合。其中一件商品可以买多件。

输 入:薯券金额、商品分别价格
输出 :组合数

输入描述:

输入薯券金额、商品分别价格
例如:10 [2,3,5]
10与[2,3,5]中间有空格

输出描述:

输出4,则结果集可以为:2,2,2,2,2;5,5;2,3,5;2,2,3,3共有4种组合

输入例子1:

10 [2,3,5]

输出例子1:

4

代码实现

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String s = sc.next();
        String[] arrStr = s.substring(1,s.length() - 1).split(",");
        int[] nums =  new int[arrStr.length];
        for(int i = 0; i < nums.length; i++){
            nums[i] = Integer.parseInt(arrStr[i]);
        }
        int[] dp = new int[num + 1];
        dp[0] = 1;
        for(int i = 0; i < nums.length; i++){
            for(int j = nums[i]; j <= num;j++){
                dp[j] += dp[j - nums[i]];
            }
        }
        System.out.println(dp[num]);
    }
}

薯队长写了一篇笔记草稿,请你帮忙输出最后内容。

  1. 输入字符包括,"(" , “)” 和 "<"和其他字符。
  2. 其他字符表示笔记内容。
  3. ()之间表示注释内容,任何字符都无效。 括号保证成对出现。
  4. "<“表示退格, 删去前面一个笔记内容字符。括号不受”<"影响 。

输入描述:

输入一行字符串。长度<=10000.

输出描述:

输出一行字符串,表示最终的笔记内容。

输入例子1:

Corona(Trump)USA<<Virus

输出例子1:

CoronaVirus

代码实现

import java.util.*;

public class Main {
   public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
       String s = sc.next();
       int num = 0;
       StringBuilder res = new StringBuilder();
       for(int i = 0; i < s.length(); i++){
           if(s.charAt(i) == '(') num ++;
           if(num != 0){
               if(s.charAt(i) == ')') num --;
               continue;
           }
           if(s.charAt(i) == '<'){
               res.deleteCharAt(res.length() - 1);
               continue;
           }
           res.append(s.charAt(i));
       }
       System.out.println(res.toString());
   }
}

薯队长写了n篇笔记,编号从1~n,每篇笔记都获得了不少点赞数。

薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:

  1. 不能出现连续编号的笔记。
  2. 总点赞总数最多
    如果满足1,2条件有多种方案,挑选笔记总数最少的那种

输入描述:
输入包含两行。第一行整数n表示多少篇笔记。 第二行n个整数分别表示n篇笔记的获得的点赞数。
(0<n<=1000, 0<=点赞数<=1000)

输出描述:

输出两个整数x,y。空格分割。
x表示总点赞数,y表示挑选的笔记总数。

输入例子1:

4
1 2 3 1

输出例子1:

4 2

代码实现

import java.util.*;

public class Main{
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0 ; i < n; i++){
            arr[i] = sc.nextInt();
        }
        int[] dp = new int[n + 2];
        int[] dpNum = new int[n + 2];
        for(int i = 2; i < n+2; i++){
            if(dp[i-1] >= dp[i-2]+arr[i-2]){
                dp[i] = dp[i-1];
                dpNum[i] = dpNum[i-1];
            } else {
                dp[i] = dp[i-2] + arr[i-2];
                dpNum[i] = dpNum[i-2] + 1;
                
            }
        }
        System.out.println(dp[n+1] + " " + dpNum[n+1]);
    }
}

解题分析

dp[i] = x 表示从i开始选笔记,最大点赞数为x。dpNum[i]表示此时选取的次数

动态转移方程为dp[i] = max(dp[i-1], dp[i-2]+arr[i-2])

由于本题还需要求次数,所以再构造一个dpNum数组,用来存储得到dp[i]时,选取的笔记次数。
状态方程与dp数组类似,当选取了arr[i],则dpNum[i] = dpNum[i-2] + 1,否则不选取的情况则为 dpNum[i] = dpNum[i-1]


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值