作者kasuma (宽)
看板java
标题[问题] 试算表
时间Tue Jun 14 21:14:12 2011
自家公司有需要 必须写一个试算表程式
需求是这样
现在有五个规格的产品
假设是 21 22 23 24 25 单位是公克
现在要包装成 6/7/8粒 一盒
每盒限重假设是130g
列出所有组合的可能
EX: 21 21 22 23 24
代表六颗里面 21规格的两颗 22 23 24规格各一颗
我试着写了一下,以每盒装六粒为例子
列出所有组合可能:
public static void main(String[] args) {
System.out.println("count test");
int []pro = {0,21,22,23,24,25};
//五种规格
for(int i=1;i<=5;i++){
System.out.println();
for(int j=1; j<=5; j++ ) {
for(int k=1; k<=5; k++ ) {
for(int l=1; l<=5; l++ ) {
for(int m=1; m<=5; m++ ) {
for(int n=1; n<=5; n++ ) {
if(pro[i]+pro[j]+pro[k]+pro[l]+pro[m]+pro[n]==130){
System.out.println();
System.out.print(pro[i]+" ");
System.out.print(pro[j]+" ");
System.out.print(pro[k]+" ");
System.out.print(pro[l]+" ");
System.out.print(pro[m]+" ");
System.out.print(pro[n]+" ");
System.out.print(pro[i]+pro[j]+pro[k]+pro[l]+pro[m]+pro[n]);
}
}
}
}
}
}
}
}
}
这种写法会造成重复的组合
EX 21 21 21 21 22 21 跟 22 21 21 21 21 21 其实是一样的
请问各位高手我该如何修改我的程式
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.79.123
1F:推 peacedove:用Set?? 06/14 21:34
2F:→ tkcn:我觉得你把题目描述清楚比较重要,前面 a~e 的作用是什麽? 06/14 21:36
3F:推 asilzheng:跑一次至少要跑5^6=15725次 要不要改用数学的排列组合? 06/14 21:37
4F:→ asilzheng:算错 是15625 06/14 21:38
5F:→ kasuma:a~e那个地方这只程式还用不到 06/14 21:43
※ 编辑: kasuma 来自: 114.32.79.123 (06/14 21:47)
6F:推 asilzheng:变数改为记每种重量的数量如何?? 最後再依数量印出 06/14 22:20
7F:推 lucky17:是小於等於130,还是要刚好要等於130 ? 06/14 22:24
8F:→ lucky17:把 j -> for( j=i; ...) k -> for( k=j; ... ) 依此类推 06/14 22:26
10F:→ peacedove:这个不知道符不符合你的需求 06/14 23:23
12F:推 peacedove:唉呀 我没注意到要重量=130XD 06/14 23:42
13F:→ kasuma:感谢各位解答 我来琢磨琢磨 06/14 23:46
14F:推 peacedove:更新了一下我连结的档案 不过我的class主要只做排列组合 06/14 23:53
15F:推 peacedove:判断符不符合重量的部份写在main里面XD 06/14 23:56
16F:→ lucky17:应该还不用出动sort吧?把j的起始从=i开始,k从=j开始,依此? 06/15 00:57