回 帖 发 新 帖 刷新版面

主题:菜鸟求救:求和问题

求和(he.pas)
[问题描述]
已知n个整数x1,x2,……,xn,以及两个整数k(k<n)和p。从n个整数中任选k个整数相加,可分别得到一系列的和。例如n=4,k=3, 4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:
3+7+12=22    3+7+19=29   7+12+19=38   3 +12 +19=34
现在,要求你找出和小于p并最接近p的一个数。
例如上例,若p=32,则要找的数为29。 
[输入格式]
输入文件有两行,第一行有三个整数n(1≤n≤30),k(0<k<n)和p(<0p<231),第二行有n个整数x1,x2,……,xn(1≤xi≤5000000)。
[输出格式]
输出文件只有满足上述条件的一个整数。
[输入样例]
4  3  32
3  7  12  19
[输出样例]
29


帮我分析分析一下。谢谢。

回复列表 (共1个回复)

沙发

申请一个[0..231,0..30](你确信p的范围只有这么小?)的true数组m
令m[0,0]=true
for i:=1 to n for j:=0 to p-x[i] do for k:=0 to k do if m[j,k] then m[j+x[i],k+1];=true
(这个应该差不多,得调)
最后从p downto 1循环找m[i,k]为真的输出i即可。

我来回复

您尚未登录,请登录后再回复。点此登录或注册