某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来购买一批商品,求有多少种购买组合。其中一件商品可以买多件。
输 入:薯券金额、商品分别价格
输出 :组合数
输入描述:
输入薯券金额、商品分别价格
例如: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]);
}
}
薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
- 输入字符包括,"(" , “)” 和 "<"和其他字符。
- 其他字符表示笔记内容。
- ()之间表示注释内容,任何字符都无效。 括号保证成对出现。
- "<“表示退格, 删去前面一个笔记内容字符。括号不受”<"影响 。
输入描述:
输入一行字符串。长度<=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条件有多种方案,挑选笔记总数最少的那种
输入描述:
输入包含两行。第一行整数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]