首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求个算法,该如何解决

2014-01-12 
求个算法求arr[]{0.25, 0.5, 1, 2, 4}中任意数相加6的所有组合,包括自身相加。[解决办法]其实这个刚好有

求个算法
求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>


#include <vector>
#include <iostream>
using namespace std;

void printPair(const pair<float,int>& p)
{
    for(int i = 0, n = p.second; i < n; ++i){
        if(i > 0) cout << "+";
        cout << p.first;
    }
}
void printVec(const vector<pair<float,int> >& v)
{
    for(int i = 0, s = v.size(); i < s; ++i){
        if(i > 0) cout << "+";
        printPair(v[i]);
    }
}

void solve(float arr[], int i, float remain, vector<pair<float,int> >& v)
{
    if(remain == 0){
        printVec(v);
        cout << "\n";
        return;
    }
    if(i < 0) return;
    
    //if can choose arr[i]
    if(remain >= arr[i]){    
        for(int n = remain / arr[i]; n > 0; --n){
            v.push_back(make_pair(arr[i], n));
            solve(arr, i - 1, remain - n * arr[i], v);
            v.pop_back();
        }
    }
    //do not choose arr[i]
    solve(arr, i - 1, remain, v);
}


int main()
{
    float arr[] = {0.25, 0.5, 1, 2, 4}, target = 6;
    vector<pair<float,int> > v;
    
    solve(arr, sizeof(arr)/sizeof(arr[0]) - 1, target, v);
    
    return 0;
}

热点排行