求助把一些数值按指定的和进行分组

jo_kevin 2006-04-01 07:30:53
有n个已经编号的面,现在要把这些面按指定的面积值t进行分组,每一组面的面积总和不能超过指定值

t,但是当这个面的值大于或等于d时就要单独分为一组。(注,程序是通过编号来读取面积的,可以把

面积和编号放在多维数组中)

示例:
t=200
d=160
编号 面积
1 30
2 110
3 80
4 90
5 20
6 73
7 180
8 80
9 40
10 50
11 170
12 80

按题目要求的结果为:

编号 面积
第一组
1 30
3 80
4 90


第二组
2 110
5 20
6 63


第三组
7 180


第l四组

8 80
9 40
10 50

第五组
11 170


第六组(由于80没有组合的对象了,就单独分为一组)
12 80
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TONYBLARED 2006-05-25
  • 打赏
  • 举报
回复
搂主还有什么问题吗?
dztc 2006-04-02
  • 打赏
  • 举报
回复
mark
xcrow713 2006-04-02
  • 打赏
  • 举报
回复
上面说的不错,其实思路很简单,从数组的第一个开始判断,若当前这个值大于d的160,就让它单独为一组,后面开始另为一组;若当前值小于160,就把它和当前组中已有的值相加判断和,若和大于t 的200,就把当前值另起一组,和小于200就把当前值添加到当前组中。
jo_kevin 2006-04-01
  • 打赏
  • 举报
回复
不错的,能不能说说实现的方法或思路
TONYBLARED 2006-04-01
  • 打赏
  • 举报
回复
不好意思,要修改一下:
public void groupSquare(int[] id, int[] square, int max, int single) {
if (id.length != square.length)
return;
List all = new ArrayList();
ArrayList group = new ArrayList();
int sum = 0;
for (int i = 0; i < id.length; i++) {
int index = id[i];
int value = square[index];
Map map = new HashMap();
map.put(index+1 + "", value + "");
if (value >= single) {
List big = new ArrayList();
big.add(map);
all.add(big);
continue;
}
if (sum + value > max) {
ArrayList enough = (ArrayList) group.clone();
all.add(enough);
group.clear();
group.add(map);
sum = value;
} else {
group.add(map);
sum = sum + value;
}
}
all.add(group);
print(all);
}
TONYBLARED 2006-04-01
  • 打赏
  • 举报
回复
输出结果为:

组别:1
编号 面积
0 30
1 110

组别:2
编号 面积
2 80
3 90
4 20

组别:3
编号 面积
6 180

组别:4
编号 面积
5 73
7 80
8 40

组别:5
编号 面积
10 170
TONYBLARED 2006-04-01
  • 打赏
  • 举报
回复
看了下楼主给的需求,我有不明确的地方:
1 “程序是通过编号来读面积的”。好像在楼主给的demo里并未体现。

本人写了个方法,可大致供楼主参考一下。
public void doFun01() {
int[] id = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int[] square = { 30, 110, 80, 90, 20, 73, 180, 80, 40, 50, 170, 80 };
int max = 200;
int single = 160;
groupSquare(id, square, max, single);
}

public void groupSquare(int[] id, int[] square, int max, int single) {
if (id.length != square.length)
return;
List all = new ArrayList();
ArrayList group = new ArrayList();
int sum = 0;
for (int i = 0; i < id.length; i++) {
int index = id[i] - 1;
int value = square[index];
Map map = new HashMap();
map.put(index + "", value + "");
if (value >= single) {
List big = new ArrayList();
big.add(map);
all.add(big);
continue;
}
if (sum + value > max) {
ArrayList enough = (ArrayList) group.clone();
all.add(enough);
group.clear();
group.add(map);
sum = value;
} else {
group.add(map);
sum = sum + value;
}
}
print(all);
}

public void print(List all) {
for (int i = 0; i < all.size(); i++) {
Conica.pl("\n组别:"+(i+1));
Conica.pl("编号\t面积");
List group = (List)all.get(i);
for(int j=0; j<group.size(); j++){
HashMap map = (HashMap)group.get(j);
Iterator it = map.keySet().iterator();
while(it.hasNext()){
String key = (String)it.next();
String value = (String)map.get(key);
Conica.pl(key+"\t"+value);
}
}
}
}

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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