急求:有序数组的一个算法问题,谢谢!

如何在一个有序数组中(比如10,7,6,6,4,3,2,1)中挑选k个数(k从1到n),使得它们的和为s(s为数组中最大的那个数,也就是第一个数)。请问除了枚举有什么好方... 如何在一个有序数组中(比如10,7,6,6,4,3,2,1)中挑选k个数(k从1到n),使得它们的和为s(s为数组中最大的那个数,也就是第一个数)。
请问除了枚举有什么好方法吗?(k从1开始递增,需要给出所有情况)
谢谢!
展开
 我来答
miniapp9TIcunqu2xxCv
2010-06-17 · TA获得超过1094个赞
知道小有建树答主
回答量:410
采纳率:100%
帮助的人:486万
展开全部
采用动态规划算法,经典的背包问题。

f(i,j)为使用i个数使它们的和为j,是否可能。
如果可能,f(i,j)=true,否则为false.

这样对所有的数字循环,有f(i,j)=f(i,j) or f(i-1,j-num[k])
num[k]是所有的数字循环一次。

这样按照i,j递增的顺序就可以得到结果。想要得到原先的选数还要另外设置g(i,j)保存使f(i,j)变为true的k。向上找就可以找到答案。

我要睡觉了所以写的不清楚。

想知道的话请百度关键字:背包问题 动态规划
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
alex_hy
2010-06-17 · TA获得超过1.3万个赞
知道大有可为答主
回答量:2601
采纳率:100%
帮助的人:978万
展开全部
用递归函数不是很好做?

数组int tab(1:n)
函数fun(int tab(1:n),k,s)

那么 fun(int tab(1:n),k,s)=fun(int tab(2:n),k,s),fun(int tab(1:n),k-1,s-tab(1))

即从1~n中挑选k个数的问题,其实分成两种情况:
1.数组的第一个数不选,那么从2~n中挑选k个数,使和为s
2.选第一个数,那么从2~n中挑选k-1个数,使和为(s-数组的第一个数)

然后只要写收敛条件就可以了,即当n=k时,如果s=sum(tab(1:n)),打印,否则直接返回
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式