求助把一些数值按指定的和进行分组
有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
问题点数:20、回复次数:7Top
1 楼TONYBLARED(奔放的犀牛)回复于 2006-04-01 21:05:13 得分 0
看了下楼主给的需求,我有不明确的地方:
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);
}
}
}
}
Top
2 楼TONYBLARED(奔放的犀牛)回复于 2006-04-01 21:05:34 得分 0
输出结果为:
组别: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
Top
3 楼TONYBLARED(奔放的犀牛)回复于 2006-04-01 21:28:53 得分 0
不好意思,要修改一下:
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);
}Top
4 楼jo_kevin()回复于 2006-04-01 23:15:52 得分 0
不错的,能不能说说实现的方法或思路Top
5 楼xcrow713(绝体绝命)回复于 2006-04-02 00:25:30 得分 0
上面说的不错,其实思路很简单,从数组的第一个开始判断,若当前这个值大于d的160,就让它单独为一组,后面开始另为一组;若当前值小于160,就把它和当前组中已有的值相加判断和,若和大于t 的200,就把当前值另起一组,和小于200就把当前值添加到当前组中。Top
6 楼dztc()回复于 2006-04-02 00:37:45 得分 0
markTop
7 楼TONYBLARED(奔放的犀牛)回复于 2006-05-25 15:01:09 得分 0
搂主还有什么问题吗?
Top




