数据组合问题

上官云峰 2009-07-14 09:54:25
有一组数据

2 4.04
3 1.5
4 4.12
5 1.5
6 2.64
7 3.31
8 4.8
9 9.6
10 9.6

假如我给个合计值是19.2 那么应该是9和10的合计;如果合计值是24 那么应该是8、9、10的合计
这个算法怎么写[我确定拆分出来的一定是一组数据]
...全文
58 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-07-16
  • 打赏
  • 举报
回复
确实是背包问题,而且是01背包,最近讨论的很多,LZ看看这个帖子吧
http://topic.csdn.net/u/20090511/23/a482be66-6598-46fa-be19-e7e356e2244b.html

(每次都推荐自己发言的帖子,都有点不好意思了,其实主要是因为好找,其实关于背包的帖子挺多的,LZ可以自己搜索一下)
firePhoenix1981 2009-07-15
  • 打赏
  • 举报
回复
递归实现:
#include "stdio.h"

int bag_loop(int A[], int M[], int total)
{
int i,j;

for(i=1;i<=A[0];i++)
{
if(1==M[i]){
continue;
}
M[i]=1;
if(total==A[i]){
printf("%4d\n", A[i]);
return 1;
}
if(total>A[i]){
if(0!=bag_loop(A, M, total-A[i])){
printf("%4d\n",A[i] );
return 1;
}
}
M[i]=0;
}

return 0;
}

int main(void)
{
int A[]={9, 404, 15, 412, 15, 264, 331, 48, 96, 96};
int M[]={0, 0 , 0, 0, 0, 0, 0, 0, 0, 0};
int i;

/*use the normal algorithm*/
bag_loop(A, M, 361);

for(i=1; i<=A[0]; i++)
{
printf("%4d", M[i]);
}
printf("\n");


return 0;
}
千与 2009-07-15
  • 打赏
  • 举报
回复
如果数据量很小,可以考虑先对数据(实型)从小到大进行排序,然后执行累加操作,得到实际需要的合计值(如果存在),返回条目编号序列;
如果数据量较大,可以考虑建立排序二叉树,通过遍历排序二叉树,累加合计总数,返回条目编号序列。
showjim 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tanwan 的回复:]
背包小数如何做?
[/Quote]
小数和整数与思路无关吧,2位小数*100就化成整数问题了,难道题目里面有无限小数?
donkey301 2009-07-14
  • 打赏
  • 举报
回复
恩,的确是。石头的价值就可以认为正比于质量。
jlp999 2009-07-14
  • 打赏
  • 举报
回复
如果数据不多,直接做数据表格映射和值就好。
如:

4.04->2
5.54->2,3
9.66->2,3,4
5.62->3,4
……

fire_woods 2009-07-14
  • 打赏
  • 举报
回复
一组数就是对应的石头的质量,你要求的那个数就是背包最多能装的质量.

用背包问题求最优解,如果刚好装满,就是你要的解.
上官云峰 2009-07-14
  • 打赏
  • 举报
回复
怎么出来啊,给个方法啊
fire_woods 2009-07-14
  • 打赏
  • 举报
回复
不用连续是背包问题.
上官云峰 2009-07-14
  • 打赏
  • 举报
回复
不用连续,只要找出来就可以
上官云峰 2009-07-14
  • 打赏
  • 举报
回复
上面的数据是两列 前面的是ID,后面的是数值

2 4.04
3 1.5
4 4.12
5 1.5
6 2.64
7 3.31
8 4.8
9 9.6
10 9.6
hlwang_1984 2009-07-14
  • 打赏
  • 举报
回复
思考中。。。
fire_woods 2009-07-14
  • 打赏
  • 举报
回复
需要连续否?
比如2,4可以吗?
ltmit 2009-07-14
  • 打赏
  • 举报
回复
顶7楼。
tanwan 2009-07-14
  • 打赏
  • 举报
回复
背包小数如何做?
firePhoenix1981 2009-07-14
  • 打赏
  • 举报
回复
嗯,背包问题从思想上来说应该可以
我开始太呆板了
fire_woods 2009-07-14
  • 打赏
  • 举报
回复
google 背包问题.
firePhoenix1981 2009-07-14
  • 打赏
  • 举报
回复
先对数据从大到小排序,然后小于(等于)待合计的数据开始出递归就可以解出来,不过复杂度可能大了些

背包的话,如何弄?可否详细说下

33,028

社区成员

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

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