回 帖 发 新 帖 刷新版面

主题:[回帖就加分]这题除了回溯还有别的方法吗?

你要把N个东西要发给M个人。
这些东西有3种属性(以下用A B C表示)。
当每个人得到一个东西时,为了感谢你,他会给你钱。他们不喜欢每次都得到一样的东西,所以你给他们的东西不一样,他们给你的钱也不一样。当某个人这次和前两次(如果获得的东西不足3个,则按到目前位置获得的东西总数来算)获得的东西中:
(1)全部都是一种属性的东西,则他给你1元钱。
(2)有两种不同属性的东西,则他给你2元钱。
(3)有三种不同属性的东西,则他给你3元钱。

请问,怎么发东西才能使你得到的钱最多?
(注意:并不是每个人都要分到东西,你甚至可以把东西全部发给一个人)
[输入]
输入的第一行是一个数N,表示你手上的东西总数。(1<=N<=1000)
第二行是一个数M,表示人数。(1<=M<=30)
第三行是一个长度为N的字符串,每个字符表示相应东西的属性。
[输出]
一个数,表示你最多可以得到的钱数。
[输入样例]
6
2
ABACCB
[输出样例]
12
(依次发放顺序为:第1个人、第1个人、第2个人、第2个人、第1个人、第2个人)

回复列表 (共8个回复)

沙发

用do\while语句或是for/next语句也行!

板凳

好像也只有回溯,不过你试试穷举和迭代
不过都很烦

3 楼

同意上楼的说法

4 楼

用do\while语句或是for/next语句也行

5 楼

“世界第一”与“梦幻小樱”的回答一样?!

6 楼

很简单,回溯做最快

7 楼

东西太多了,用回溯、二进制、或者穷举太慢,不过应该可以优化,实在不行用贪心吧,虽然只有80%的几率对,但是速度绝对很快。

8 楼

也可以用递归和迭代,但是可能稍麻烦一些,for;do也行,数据一大就死机了!

我来回复

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