返回信息流描述:
有两个严格递增序列,其中a=[1,3,4,5……]表示普通硬币的面值,b=[1,2……]表示纪念硬币的面值,要从两种硬币中挑选出若干硬币最终组成的面值为m,其中普通硬币可以选任意枚,纪念硬币最多选一枚,问有多少种组合情况?
输入:
多组case 序列a,序列b,目标面值m
输出:
每组case 最终组合数%1000000007
属于青蛙跳台阶的变种问题吗?没什么思路啊 求解答
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #95582同步于 2018/4/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
请教一道头条的笔试题(挑选硬币,组成某个面值的方法总数)
nemo94
2018/4/15镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
谢谢。。懂了。。
【 在 hxidkd 的大作中提到: 】
: 完全背包加01背包。首先只用普通硬币,就是个完全背包问题。然后用此时的答案作为初始状态,在纪念币上做一个01背包。
笔试同没做出来,结束之后冷静了一下写的,也不知道对不对,另外求大佬讨论第五题
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n1=sc.nextInt();
int n2=sc.nextInt();
int m=sc.nextInt();
int[] coins=new int[n1+n2];
for(int i=0;i<coins.length;i++){
coins[i]=sc.nextInt();
}
int[] dp=new int[m+1];
dp[0]=1;
for(int i=0;i<n1+n2;i++){
if(i<n1){
for(int j=1;j<=m;j++){ //区分01和完全
if(j>=coins[i]) dp[j]+=dp[j-coins[i]];
}
}
else{
for(int j=m;j>=1;j--){
if(j>=coins[i]) dp[j]+=dp[j-coins[i]];
}
}
}
System.out.println(dp[m]);
}
}