>258
これでいい?>すべての組み合わせを試す方法
#include <stdio.h>

#define LIMIT 121
#define N_STUFF (sizeof(stuff)/sizeof(stuff[0]))

static struct Stuff {
 char c;
 int weigh;
 int value;
} stuff[] = {
 { 'a', 39, 42 }, { 'b', 13, 12 }, { 'c', 68, 45 }, { 'd', 15, 5 }, { 'e', 10, 2 },
 { 'f', 20, 61 }, { 'g', 31, 89 }, { 'h', 15, 32 }, { 'i', 41, 47 }, { 'j', 16, 18 }
};

static int total_value[1 << N_STUFF];

int main(void) {
 int i, max_value = -1;
 for ( i = 0; i < (1 << N_STUFF); i++ ) {
  int j, total_weigh = 0;
  for ( j = 0; j < (int)N_STUFF; j++ ) {
   if ( i & (1 << j) ) {
    total_weigh += stuff[j].weigh;
    total_value[i] += stuff[j].value;
   }
  }
  if ( total_weigh > LIMIT )
   total_value[i] = -1;
  if ( total_value[i] > max_value )
   max_value = total_value[i];
 }
 for ( i = 0; i < (1 << N_STUFF); i++ ) {
  if ( total_value[i] == max_value ) {
   int j;
   printf( "Choise:" );
   for ( j = 0; j < (int)N_STUFF; j++ )
    if ( i & (1 << j) )
     printf( " %c", stuff[j].c );
   printf( "\ttotal value: %d\n", total_value[i] );
  }
 }
 return 0;
}