有一组数 100,200,30,49,34,232,500
要进行组合(就是相加) 每组的结果必须小于500 每组由几个元素加不限求组合后组数最小的且小于500 的组合。
eg: 20,30,200,400 进行组合 求组合后 组数最小的且小于500 的组合。
应该是 20+30+200,400
而不是 200,20+400,30
要进行组合(就是相加) 每组的结果必须小于500 每组由几个元素加不限求组合后组数最小的且小于500 的组合。
eg: 20,30,200,400 进行组合 求组合后 组数最小的且小于500 的组合。
应该是 20+30+200,400
而不是 200,20+400,30
不知我的理解对否:
已知一组数, 将这组数分成 X 组,每组的和要不大于一个给定的数 N ,求这个 X 的最小值?
List li=new ArrayList();
a.sortArray();
int m=0;
for(int i=0;i<a.length;i++)
{
m=m+a[i];
if(m>500)
{
li.add(m-a[i]);
}
}
li.add(m);
class Combination{
private List<int[]> combination(int[] a, int m) {
List<int[]> list = new ArrayList<int[]>();
Combination c=new Combination();
int n = a.length;
boolean end = false;
int[] tempNum = new int[n];
for (int i = 0; i < n; i++) {
if (i < m) {
tempNum[i] = 1;
} else {
tempNum[i] = 0;
}
}
list.add(c.createResult(a, tempNum, m));
int k = 0;
while (!end) {
boolean findFirst = false;
boolean swap = false;
for (int i = 0; i < n; i++) {
int l = 0;
if (!findFirst && tempNum[i] == 1) {
k = i;
findFirst = true;
}
if (tempNum[i] == 1 && tempNum[i + 1] == 0) {
tempNum[i] = 0;
tempNum[i + 1] = 1;
swap = true;
for (l = 0; l < i - k; l++) {
tempNum[l] = tempNum[k + l];
}
for (l = i - k; l < i; l++) {
tempNum[l] = 0;
}
if (k == i && i + 1 == n - m) {
end = true;
}
}
if (swap) {
break;
}
}
list.add(c.createResult(a, tempNum, m));
}
return list;
}
public int[] createResult(int[] a, int[] temp, int m) {
int[] result = new int[m];
int j = 0;
for (int i = 0; i < a.length; i++) {
if (temp[i] == 1) {
result[j] = a[i];
j++;
}
}
return result;
}
public static void main(String[] args) {
int[] arr={100,200,30,49,34,232,500};
Arrays.sort(arr);
int total=500;
int pos=0;
for(int i=0;i<arr.length;i++){
if(arr[i]>=500){
pos=i;
break;
}
}
int[] temp= Arrays.copyOf(arr, pos);
System.out.println(Arrays.toString(temp));
List<int[]> list=new ArrayList<int[]>();
for(int i=1;i<pos;i++){
Combination c = new Combination();
list.addAll(c.combination(temp,i));
}
printResult(list,total);
}
private static void printResult(List<int[]> list,int total){
for(int i=0;i<list.size();i++){
int sum=0;
for(int j=0;j<list.get(i).length;j++){
sum+=list.get(i)[j];
}
if(sum<500){
System.out.println(Arrays.toString(list.get(i)));
}
}
}
}办法笨了点,list存放了所有组合,所以不适合大量数据!
* @param args
*/
public static void main(String[] args) { int[] num = { 100, 200, 30, 49, 34, 232, 500 };
for (int i = 0; i < 500 / 30 + 1; i++) {
for (int j = 0; j < 500 / 34 + 1; j++) {
for (int k = 0; k < 500 / 49 + 1; k++) {
for (int m = 0; m < 500 / 100 + 1; m++) {
for (int p = 0; p < 500 / 200 + 1; p++) {
for (int b = 0; b < 500 / 232 + 1; b++) {
for (int a = 0; a < 500 / 500 + 1; a++) {
if (i * 30 + j * 34 + k * 49 + m * 100 + p
* 200 + b * 232 + a * 500 <= 500)
System.out.println("30共" + i + "个"
+ " 34共" + j + "个" + "49共" + k
+ "个" + "100共" + m + "个"
+ "200共" + p + "个" + "232共" + b
+ "个" + "500共" + a + "个");
}
}
}
}
}
}
} }}
有一组数 100,200,30,49,34,232,500
要进行组合(就是相加) 每组的结果必须小于500 每组由几个元素加不限,每个元素只能使用一次且其他组合也不能再使用了。
求组合后组数最小的且小于500 的组合。
这里要注意的是 组数最小 而且所有元素都必须使用过比如 上面数组 可以分成 3组 [30,49,34,100,200][232][500]
也可以分成4组[30][49,34,100,200][232][500]
也可以分成5组[30][49,34,100][232][500][200]
我们想要的就是分成3组的那个组合。eg: 20,30,200,400 进行组合 求组合后 组数最小的且小于500 的组合。
应该是 20+30+200,400
而不是 200,20+400,30