放一套算法训练题

    技术2022-07-12  90

    算法训练题

    贪心硬币问题区间相关问题选择不相交区间区间选点问题区间覆盖问题 字典序最小问题背包相关问题最优装载问题部分背包问题乘船问题 动态规划01背包问题钢条切割数字三角形最长公共子序列问题完全背包问题最长上升子序列问题

    贪心

    硬币问题

    有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.

    现在要用这些硬币来支付A元,最少需要多少枚硬币?

    假定本题至少存在一种支付方案.

    0≤ci≤10^9

    0≤A≤10^9

    输入:

    第一行有六个数字,分别代表从小到大6种面值的硬币的个数

    第二行为A,代表需支付的A元

    样例:

    输入

    3 2 1 3 0 2 620

    输出

    6

    说明:1500+250+110+25,共6枚

    区间相关问题

    选择不相交区间

    有n项工作,每项工作分别在si时间开始,在ti时间结束.

    对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.

    此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).

    你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?

    1≤n≤100000

    1≤si≤ti≤10^9

    输入:

    第一行:n 第二行:n个整数空格隔开,代表n个工作的开始时间 第三行:n个整数空格隔开,代表n个工作的结束时间

    样例输入:

    5 1 2 4 6 8 3 5 7 9 10

    样例输出:

    3

    说明:选取工作1,3,5

    区间选点问题

    数轴上有n个闭区间[ai,bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

    看看POJ-1201

    区间覆盖问题

    数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定线段[s,t]

    字典序最小问题

    给一个定长为N的字符串S,构造一个字符串T,长度也为N。

    起初,T是一个空串,随后反复进行下列任意操作

    从S的头部删除一个字符,加到T的尾部从S的尾部删除一个字符,加到T的尾部

    目标是最后生成的字符串T的字典序尽可能小

    1≤N≤2000 字符串S只包含大写英文字母

    输入:字符串S

    输出:字符串T

    背包相关问题

    最优装载问题

    给出n个物体,第i个物体重量为wi。选择尽量多的物体,使得总重量不超过C。

    部分背包问题

    有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。

    注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C。

    乘船问题

    有n个人,第i个人重量为wi。每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。

    动态规划

    01背包问题

    有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。

    1≤n≤100 1≤wi,vi≤100 1≤W≤10000

    输入:

    n=4 (w,v)={(2,3),(1,2),(3,4),(2,2)} W=5

    输出:

    7(选择第0,1,3号物品)

    因为对每个物品只有选和不选两种情况,所以这个问题称为01背包。

    钢条切割

    Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。

    | 长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | | - | - | - | - | - | - | - | - | - | - | 价格pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |

    钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,…n),求切割钢条方案,使得销售收益rn最大。注意,如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割。

    数字三角形

    The Triangle - POJ 1163 - Virtual Judge

    在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。

    路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。

    三角形的行数大于1小于等于100,数字为 0 - 99

    输入格式:

    5 //表示三角形的行数 接下来输入三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

    要求输出最大和

    最长公共子序列问题

    给定两个字符串,输出最长公共子序列,如输入

    AB34C A1BC2

    输出

    ABC

    完全背包问题

    有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。

    注意,每种物品可以挑选任意多件。

    1≤n≤100 1≤wi,vi≤100 1≤W≤10000

    最长上升子序列问题

    有一个长为n的数列a0,a1,…,a(n-1)。请求出这个序列中最长的上升子序列的长度。

    上升子序列指的是对于任意的i<j都满足ai<aj的子序列。

    1≤n≤1000

    0≤ai≤1000000

    输入

    n=5 a={4,2,3,1,5}

    输出

    3(注:2,3,5)
    Processed: 0.010, SQL: 9