Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- int input[25][7];
- double fitness[25][128];
- int S[25];
- double best = 0;
- int k, n;
- int power_two(int exp){
- int j = 0;
- int res= 0;
- while(j <= exp){
- if (j==0){
- res=1;
- }
- else{
- res*=2;
- }
- j++;
- }
- return res;
- }
- double bound(int pos){
- int s_min[25];
- int s_max[25];
- int i = pos;
- int j;
- int m_min = 0;
- int m_max = 0;
- double fitness_max_group = 0;
- double fitness_max = 0;
- i = 0;
- while(i<pos){
- s_min[i] = s_max[i] = S[i];
- i++;
- }
- while(i < n){
- s_min[i] = 0;
- s_max[i] = 1;
- i++;
- }
- i = 0;
- while(i<n){
- m_min = 0;
- m_max = 0;
- fitness_max_group = 0;
- j=0;
- while(j<k+1){
- if(s_min[input[i][j]] == 1){
- m_min+=power_two(k-j);
- }
- j++;
- }
- j = 0;
- while(j<k+1){
- if(s_max[input[i][j]] == 1){
- m_max+=power_two(k-j);
- }
- j++;
- }
- while(m_min <=m_max){
- if(fitness[i][m_min] > fitness_max_group){
- fitness_max_group = fitness[i][m_min];
- }
- m_min++;
- }
- fitness_max += fitness_max_group;
- i++;
- }
- return fitness_max;
- }
- void rec(int pos){
- int i = 0;
- int j = 0;
- int m = 0;
- double sum=0;
- if (pos == n){
- while(i<n){
- m=0;
- j=0;
- while(j<k+1){
- if(S[input[i][j]] == 1){
- m+=power_two(k-j);
- }
- j++;
- }
- sum += fitness[i][m];
- i++;
- }
- if (sum>best){
- best = sum;
- i = 0;
- }
- return;
- }
- if (best != 0 && bound(pos) < best){
- return;
- }
- S[pos] = 0;
- rec(pos+1);
- S[pos] = 1;
- rec(pos+1);
- }
- int main(){
- int i = 0;
- int j = 0;
- int aux;
- scanf ("%d %d", &n, &k);
- for (i=0; i<n; i++){
- for(j=0; j<k+1; j++){
- scanf("%d", &input[i][j]);
- }
- }
- i = 0;
- aux = power_two(k+1);
- j=0;
- for (i=0; i<n; i++){
- for(j=0; j<aux; j++){
- scanf("%lf", &fitness[i][j]);
- }
- }
- rec(0);
- printf("%lf\n", best);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement