求救大家帮写个算法,关于数字组合的问题

不填海的精卫 2016-06-17 05:38:52
加精
是这样的, 有N个数, 每个数的范围在[40.00,350.00} ,有小数, 现在想把这些数做组合操作,

条件:

1.每个组合的几个数字, 之和 偏差在 960 +2 和960-2 之间
2.希望每个组合的数字,比较均匀,不会一堆大的在一起,也不会一堆小的在一起
3. 不限制 每个组合的数字个数
4.打印出每个组合,和最后无法组合剩下的数字.



数学实在学的不太好...请各位大神帮忙解决下,送分
...全文
2256 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CT8100 2016-06-30
  • 打赏
  • 举报
回复
可以参考一下平均分件问题~ 先用算法将这些数进行排序,取出这些数的中间值,用总数乘以中间值除以960,然后得到大概多少堆,然后根据堆数,对已经排好顺序的数进行分处理试试看~
wdonghai 2016-06-30
  • 打赏
  • 举报
回复
#include "stdio.h"

const int n=10;

const double data[n]={300,310,320,330,340,349,280,220,200,260};//测试数据
double visit[n]={0};
double a[n]={0};

void dfs(int step)
{
	double sum=0;
	for (int i=0;i<step;i++)
	{
		sum+=a[i];
	}
	
	if ((sum>=958) && (sum<=962))
	{
		for (int i=0;i<step;i++)
		{
			printf("%.2f  ",a[i]);
		}

		printf(" = %.2f\n",sum);
	}

	for (int i=0;i<n;i++)
	{
		if (visit[i]==0)
		{
			a[step]=data[i];
			visit[i]=1;
			dfs(step+1);
			visit[i]=0;
		}
	}
}

void main()
{
	dfs(0);
	getchar();
}

HaoYuan 2016-06-27
  • 打赏
  • 举报
回复
看不懂题意,能不能举个栗子
line_us 2016-06-26
  • 打赏
  • 举报
回复
引用 11 楼 u013692607 的回复:
[quote=引用 10 楼 Rewen 的回复:] 首先比如有M个数,那么可能的排列组合就是C(m,n)( n = 1 ... m) 种可能性。 把这C(m,n)展开出来,分别放在n棵树里面。 在遍历树的时候,如果发现当前层不满足【960-2,960+2】的条件,那就跳出当前的遍历, 开始下一轮遍历。 把C(m,n)展开的代码可以参考下面的内容。 int fac(int n) { int m = 0; if (n==1) { return 1; } else { return n*fac(n-1); } } double A(int n, int m) { return fac(n)*1.0/fac(n-m); } double C(int n, int m) { return fac(n)*1.0/fac(m)/fac(n-m); }
好的兄弟,我试试[/quote] 真是太好了。
不填海的精卫 2016-06-19
  • 打赏
  • 举报
回复
引用 10 楼 Rewen 的回复:
首先比如有M个数,那么可能的排列组合就是C(m,n)( n = 1 ... m) 种可能性。 把这C(m,n)展开出来,分别放在n棵树里面。 在遍历树的时候,如果发现当前层不满足【960-2,960+2】的条件,那就跳出当前的遍历, 开始下一轮遍历。 把C(m,n)展开的代码可以参考下面的内容。 int fac(int n) { int m = 0; if (n==1) { return 1; } else { return n*fac(n-1); } } double A(int n, int m) { return fac(n)*1.0/fac(n-m); } double C(int n, int m) { return fac(n)*1.0/fac(m)/fac(n-m); }
好的兄弟,我试试
列子汤问 2016-06-18
  • 打赏
  • 举报
回复
首先比如有M个数,那么可能的排列组合就是C(m,n)( n = 1 ... m) 种可能性。 把这C(m,n)展开出来,分别放在n棵树里面。 在遍历树的时候,如果发现当前层不满足【960-2,960+2】的条件,那就跳出当前的遍历, 开始下一轮遍历。 把C(m,n)展开的代码可以参考下面的内容。 int fac(int n) { int m = 0; if (n==1) { return 1; } else { return n*fac(n-1); } } double A(int n, int m) { return fac(n)*1.0/fac(n-m); } double C(int n, int m) { return fac(n)*1.0/fac(m)/fac(n-m); }
lm_whales 2016-06-18
  • 打赏
  • 举报
回复
这是 背包吧 每包960 只是有个误差 ±2的额外要求
不填海的精卫 2016-06-18
  • 打赏
  • 举报
回复
引用 8 楼 han0956 的回复:
你这数据是有无限种解法,不知道你要寻找剩余数据最少的组合?
是啊 兄弟,,能帮忙写写么,,我憋不出来了
han0956 2016-06-18
  • 打赏
  • 举报
回复
你这数据是有无限种解法,不知道你要寻找剩余数据最少的组合?
不填海的精卫 2016-06-18
  • 打赏
  • 举报
回复
引用 5 楼 Rewen 的回复:
最后的判断条件是什么? 在【960-2,960+2】区间内的的组的个数最多, 还是每个组内的 组内的个数最均匀。 我的思路是 先做排列组合,把排列组合再展开成树,再用广度优先算法来剪枝。 最后根据 判断条件得到最优优解。
兄弟 能给个大概的算法代码么,, 我憋了一晚上 没憋出来~
不填海的精卫 2016-06-18
  • 打赏
  • 举报
回复
引用 4 楼 lm_whales 的回复:
这是 背包吧 每包960 只是有个误差 ±2的额外要求
是啊 实在不知道怎么写这个 组合算法
列子汤问 2016-06-18
  • 打赏
  • 举报
回复
最后的判断条件是什么? 在【960-2,960+2】区间内的的组的个数最多, 还是每个组内的 组内的个数最均匀。 我的思路是 先做排列组合,把排列组合再展开成树,再用广度优先算法来剪枝。 最后根据 判断条件得到最优优解。
不填海的精卫 2016-06-17
  • 打赏
  • 举报
回复
补充一下,,,用过的数字就 不能再参与组合了
不填海的精卫 2016-06-17
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
求救大家帮写个算法,关于数分组的问题 是这样的, 有比如1000个数, 每个数的取值范围≥40.00,<350.00 ,有两位小数, 现在想把这些数做分组操作, 条件: 1.每个组内的几个数之和 偏差在 960±2之间 2.希望分到每个组内的数,比较均匀,不会一堆大的在一起,也不会一堆小的在一起 3.不限制每个组内的数的个数 4.打印出每个分组,和最后无法分组剩下的数字.
赵4老师.....
赵4老师 2016-06-17
  • 打赏
  • 举报
回复
求救大家帮写个算法,关于数分组的问题 是这样的, 有比如1000个数, 每个数的取值范围≥40.00,<350.00 ,有两位小数, 现在想把这些数做分组操作, 条件: 1.每个组内的几个数之和 偏差在 960±2之间 2.希望分到每个组内的数,比较均匀,不会一堆大的在一起,也不会一堆小的在一起 3.不限制每个组内的数的个数 4.打印出每个分组,和最后无法分组剩下的数字.

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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