求个算法,该如何解决
求个算法
求arr[]={0.25, 0.5, 1, 2, 4}中任意数相加=6的所有组合,包括自身相加。
------解决方案--------------------
其实这个刚好有个规律,后面的数字都是前面的2倍,那我从后面的两个数字相加,然后开始从这两个数字进行拆,看可以分成几个2几个1等等,这就好了。
但是如果没有规律的话,只能从最大的数字开始相加,然后拆分了。注意:采用回溯法做。
------解决方案--------------------
仅供参考
------解决方案--------------------
所有的数都除以0.5,变成1,2,4,8,16相加得24, 1 = 00001,2 = 00010,4 = 00100,8 = 01000,16 = 10000,
24 = 11000,后面的自己想想吧...
------解决方案--------------------
话说这几个数刚好能精确表示呢,代码仅供参考
求arr[]={0.25, 0.5, 1, 2, 4}中任意数相加=6的所有组合,包括自身相加。
------解决方案--------------------
其实这个刚好有个规律,后面的数字都是前面的2倍,那我从后面的两个数字相加,然后开始从这两个数字进行拆,看可以分成几个2几个1等等,这就好了。
但是如果没有规律的话,只能从最大的数字开始相加,然后拆分了。注意:采用回溯法做。
------解决方案--------------------
仅供参考
//问题是这样,有N个数字,数值不同,要列出用他们不同的组合相加等于1000的情况。
//比如,a[3]={200,300,400}
//则有的情况为:
//5 0 0
//3 0 1
//2 2 0
//1 0 2
//0 2 1
//等情况。
#include <stdio.h>
int a[3]={200,300,400};
int temp[3]={0,0,0};
void function(int sum, int index) {
int j,i;
if (sum==1000) {
for (j=0;j<3;j++) printf("%d ",temp[j]);
printf("\n");
return;
} else if (sum>1000) return;
else for (i=index;i<3;i++) {
temp[i]++;
function(sum+a[i],i);
temp[i]--;
}
}
void main() {
function(0,0);
}
//5 0 0
//3 0 1
//2 2 0
//1 0 2
//0 2 1
//
//n个(2<=n<=20)整数(整数范围-10<=x<=10),判断是否可以从这n个数中找到若干个数,其和为10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
int MAXN=20;
int MINN=2;
int x[20];
int n,i,j,k,sum;
int main() {
srand((unsigned)time(NULL));
n=MINN+rand()%(MAXN-1);
for (i=0;i<n;i++) {
x[i]=-10+rand()%21;
printf("%d,",x[i]);
}
printf("\n");
sort(&x[0],&x[n]);
do {
for (i=2;i<=n;i++) {
sum=0;
k=n/2-i/2;
for (j=k;j<k+i;j++) {
sum+=x[j];
}
if (10==sum) {
for (j=k;j<k+i;j++) {
if (j==k+i-1) {
printf("%d==10\n",x[j]);
} else {
printf("%d+",x[j]);
}
}
printf("YES\n");
return 1;
}
}
} while (next_permutation(&x[0],&x[n]));
printf("NO\n");
return 0;
}
------解决方案--------------------
所有的数都除以0.5,变成1,2,4,8,16相加得24, 1 = 00001,2 = 00010,4 = 00100,8 = 01000,16 = 10000,
24 = 11000,后面的自己想想吧...
------解决方案--------------------
话说这几个数刚好能精确表示呢,代码仅供参考
#include <utility>