笔试真题

这篇博客讨论了一道华为笔试题,涉及到用不同长度的线段拼接成指定长度的问题。通过动态规划的方法,实现了从回溯法到更高效的状态转移方程的解决方案,但代码最终只通过了80%的测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.华为笔试第3题

题目描述:假如有1米和2米的线段若干,现需要拼接成4米的线段,一共有1+1+1+1,1+1+2,2+2, 3种拼接方法。
现在需要拼接m米线段,有C1,C2,C3,…线段可供选择,一共有多少种拼接方法。

输入:4 1 2
输入描述:第一个值为需要拼接的线段长度,后面的值为可供选择的线段长度

输出:3

解题思路:看到该题,和上一题有点类似,有点类似于硬币找零的问题,求一共有多少种找零的方法。
首先能想到的就是采用回溯法,列举出所有的可能,但是如果m很大的话时间复杂度太高了。
我们可以采用动态规划的思路去求解:
(1)状态定义:定义一个二维动态数组dp[i][j],表示前i种可供选择的线段拼接成长度j的线段最多有多少种拼接方法。
(2)状态转移方程:dp[i][j] = dp[i-1][j]+dp[i][j-c[i-1]]
(3)初始化:dp[0][i] = 0; dp[i][0] = 1
(4)返回值:dp[c.length][m]

代码

	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		String[] s = sc.nextLine().split(" ");
		int m = Integer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值