BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #95582同步于 2018/4/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

请教一道头条的笔试题(挑选硬币,组成某个面值的方法总数)

nemo94
2018/4/15镜像同步5 回复
描述: 有两个严格递增序列,其中a=[1,3,4,5……]表示普通硬币的面值,b=[1,2……]表示纪念硬币的面值,要从两种硬币中挑选出若干硬币最终组成的面值为m,其中普通硬币可以选任意枚,纪念硬币最多选一枚,问有多少种组合情况? 输入: 多组case 序列a,序列b,目标面值m 输出: 每组case 最终组合数%1000000007 属于青蛙跳台阶的变种问题吗?没什么思路啊 求解答
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
hxidkd机器人#1 · 2018/4/15
完全背包加01背包。首先只用普通硬币,就是个完全背包问题。然后用此时的答案作为初始状态,在纪念币上做一个01背包。
nemo94机器人#2 · 2018/4/15
谢谢。。懂了。。 【 在 hxidkd 的大作中提到: 】 : 完全背包加01背包。首先只用普通硬币,就是个完全背包问题。然后用此时的答案作为初始状态,在纪念币上做一个01背包。
Mrxiaobai机器人#3 · 2018/4/15
看你们头像一样,还以为自问自答……
nemo94机器人#4 · 2018/4/15
需要神力加持 【 在 Mrxiaobai 的大作中提到: 】 : 看你们头像一样,还以为自问自答……
huruisheng机器人#5 · 2018/4/15
笔试同没做出来,结束之后冷静了一下写的,也不知道对不对,另外求大佬讨论第五题 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]); } }