HDOJ 1015

1.DFS:

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; 
char str[20], ans[10]; 
int vis[20], flag; 
bool cmp(char a, char b){return a > b;}
void dfs(int dep, int target, int len){
    if(dep == 5){
        int sum = 0; 
        for(int i = 1; i <= 5; i ++)
            sum += (int)pow(ans[i-1]-'A'+1., i)*(int)pow(-1., i+1); 
        if(sum == target){
            flag = 1; 
            printf("%s\n", ans); 
        }
        return ; 
    }
    for(int i = 0;  i < len; i ++){
        if(!vis[i]){
            vis[i] = 1; 
            ans[dep] = str[i]; 
            dfs(dep+1, target, len); 
            if(flag) return;    
            vis[i] = 0; 
        }
    }
}
int main(){
    int target; 
    freopen("in.c", "r", stdin); 
    while(~scanf("%d%s", &target, str) && strcmp(str, "END") && target){
        flag = 0; 
        memset(vis, 0, sizeof(vis)); 
        int len = strlen(str); 
        sort(str, str+len, cmp); 
        dfs(0, target, len); 
        if(!flag) printf("no solution\n"); 
        memset(str, 0, sizeof(str)); 
    }
    return 0; 
}

2.二进制枚举:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std; 
int main(){
    int n, a[20]; 
    string str; 
    freopen("in.c", "r", stdin); 
    while(cin >> n >> str && str != "END" && n){
        char ans[10] = "A";  
        int flag = 0; 
        for(int i = 0;i < (1 << str.size()); i ++){
            int cnt = 0, sum = 0; 
            for(int j = 0; j < str.size(); j ++){
                if(i & (1 << j)) a[cnt++] = j; 
            }
            if(cnt == 5){
                char tmp[10]; 
                for(int i = 0; i < 5; i ++) tmp[i] = str[a[i]];
                sort(tmp, tmp+5); 
                do{
                    int sum = 0; 
                    for(int i = 1; i <= 5; i ++) 
                        sum += (int)pow(-1., i+1)*(int)pow(tmp[i-1]-'A'+1., i); 
                    if(sum == n){
                        flag = 1; 
                        if(strcmp(ans, tmp) < 0) strcpy(ans, tmp); 
                    }
                }while(next_permutation(tmp, tmp+cnt)); 
            }
        }
        if(flag) printf("%s\n", ans); 
        else cout << "no solution" << endl; 
    }
    return 0; 
}


posted on 2014-04-30 18:39  wangzhili  阅读(141)  评论(0编辑  收藏  举报