求一道算法题的思想

meihuakai 2010-05-10 05:13:06
拉选票的时候为了获胜要贿赂,贿赂数达到一定的限度后就可以获选胜利,但是有一种情况,比如贿赂A 要100元,贿赂B要80元,但是B是A的附属,显然贿赂A后就不用再贿赂B了,就是说用100元贿赂A后就可以得到两张选票,现在要达到目标票数,求最少花费多少钱?
输入格式:

4 3  --(总共4个国家,需要3张选票才能获胜)
A 100
B 80 A --B是A的附属国
C 60
D 70

输出格式:
160   --最小代价

忘各位高手给个思路,最好有伪代码.谢谢
...全文
234 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bupt_xiaoz 2010-05-12
  • 打赏
  • 举报
回复
假设情况
A110 B20 C50 D70 B为A附属


20 50 55{110 20} 70

贪心选择当前最小的数,如果遇到包含附属的值 X,则对总票数+1 总花销 +x*2-min{100,20}x(因为按贪心选择,20肯定提前被选中了)
hellodota121 2010-05-12
  • 打赏
  • 举报
回复
这个就是在组合的算法里去修改一下。

http://topic.csdn.net/u/20100508/22/7bc92b38-770e-462d-8662-d9ef8ed3afb4.html

参考我这个问题的回答。
sandbad0x 2010-05-12
  • 打赏
  • 举报
回复
看错了,是有向图,而不是无向图;
有附属国建立如下有向关系A->B;
num[A]=A到A的所有后继节点个数;
对于每个连通分支先选子节点后选祖先结点;
深搜选择最小的。
sandbad0x 2010-05-12
  • 打赏
  • 举报
回复

初始g[][] = 0;
如果A是B的附属,g[A][B] = 1;
for 每个点vi
如果vi没访问到
从vi深搜-->得到一个连通分支i
cost[i] = 连通分支i里的一个最小费用,num[i]=连通分支i里选票数量.
end;
每个cost[i]从小到大排序;
for 每个i
if totalnum + num[i] <= need
totalcost += cost[i], totalnum += num[i];
else
break;
totalcost即是所要的

sandbad0x 2010-05-12
  • 打赏
  • 举报
回复
有附属的选票可以建一个连通分支,可以从该连通分支里选出一个面额最小的选票(作为该连通分支面额的代表),票数加上该连通分支里选票的个数。这样,总共有N个连通分支,贪心选择,达到数量时停止。
qq120848369 2010-05-11
  • 打赏
  • 举报
回复
全算一遍得了.
fenix124 2010-05-11
  • 打赏
  • 举报
回复
感觉有点像背包问题,数据量是多大的?
meihuakai 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 michael122 的回复:]
ls,用贪心啊,B20是排在第一个的,肯定是要先选啊
可能我没说清楚,B也单独算一个,A也算(但是应该记录A有附属的信息,且平均价格为50,但是如果B在这之前被选了,A就是单独的节点了)
所以细节还是要费点周折
[/Quote]
能麻烦你写下伪代码吗?谢谢
michael122 2010-05-11
  • 打赏
  • 举报
回复
ls,用贪心啊,B20是排在第一个的,肯定是要先选啊
可能我没说清楚,B也单独算一个,A也算(但是应该记录A有附属的信息,且平均价格为50,但是如果B在这之前被选了,A就是单独的节点了)
所以细节还是要费点周折
qiantangcun 2010-05-11
  • 打赏
  • 举报
回复
这个问题 即使算出来 也没有 通用性
shiweijian1986 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 michael122 的回复:]
贪心吧,按照贿赂金额从小到大排序
有附属国的情况要加在一起算平均值,比如 A,B合在一起,其实相当于50元一张选票
选的时候先选金额最少的A (包含B),这样还差一张选票
然后选C

如果还差k张选票,剩下的一个带附属国的情况,国家数多于k,这个情况要特殊处理一下,比方说还差一张选票,这样不一定要选带附属国的A (100元),可以选择D,虽然D比A,B的平均价要高。这个处理起来应该不难
[/Quote]
忽略了一种情况若 A100 B20 C50 D70
按照你的算法选择100 50 =150
但是可以选择20 50 70 = 140
区别在于 A和B计算时候应该有两个并行路径 一种 分开A 100 B 20 另外一种 打包(A60 B60)
所以两种路径应该都是计算结果进行比较
shiweijian1986 2010-05-10
  • 打赏
  • 举报
回复
贪心吧,按照贿赂金额从小到大排序
有附属国的情况要加在一起算平均值,比如 A,B合在一起,其实相当于50元一张选票
选的时候先选金额最少的A (包含B),这样还差一张选票
然后选C

如果还差k张选票,剩下的一个带附属国的情况,国家数多于k,这个情况要特殊处理一下,比方说还差一张选票,这样不一定要选带附属国的A (100元),可以选择D,虽然D比A,B的平均价要高。这个处理起来应该不难

顶 全部转换为单个路径 再从从最小路径开始算起
超级大笨狼 2010-05-10
  • 打赏
  • 举报
回复
这个就是在组合的算法里去修改一下。

http://topic.csdn.net/u/20100508/22/7bc92b38-770e-462d-8662-d9ef8ed3afb4.html

参考我这个问题的回答。
michael122 2010-05-10
  • 打赏
  • 举报
回复
贪心吧,按照贿赂金额从小到大排序
有附属国的情况要加在一起算平均值,比如 A,B合在一起,其实相当于50元一张选票
选的时候先选金额最少的A (包含B),这样还差一张选票
然后选C

如果还差k张选票,剩下的一个带附属国的情况,国家数多于k,这个情况要特殊处理一下,比方说还差一张选票,这样不一定要选带附属国的A (100元),可以选择D,虽然D比A,B的平均价要高。这个处理起来应该不难

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧