Oui knapsack lui ressemble mais c'est pas la même forme.
tama (./19) :
alors,
1. oui, il n'y a pas beaucoup d'éléments, une dizaine environ
2. on ne peut pas utiliser plusieurs fois un nombre, c'est le prendre ou ne pas le prendre
3. j'ai pas compris vos histoires 
1° Ok, en listant toutes les possibilités tu devrais pouvoir t'en sortir, mais entre 10 et 11 éléments y a une grosse différence déjà. 1024 additions à faire pour 10 éléments en entrée, et 2048 pour 11 éléments.
2° ok, donc les variables (les x1,x2,...,xn) seront dans {0,1} (et je dis bien {0,1} pas [0,1])
3° En fait, c'est un problème linéaire d'optimisation. Il existe des outils (et des algorithmes) tout prets qui peuvent résoudre des problèmes du genre:
Minimiser (Expression)
sous les contraintes: (suite d'expression)
il faut que les "expression" soient linéaires. Ici tes variables de décision sont les x1,x2, .. xn que j'ai cité. Tu balances ça à un outil:
Minimiser N - v1*x1 - v2*x2 ... - vn*xn
sous (rien)
et tu dis à l'outil que tu veux que x1 soit 0 ou 1, pareil pour les autres xi.
et donc l'outil te sortira la combinaison qui minimise la différence entre la somme et N. Sauf que ça, il va te mettre tous les xi à 1 pour avoir l'expression N - v1*x1 - v2*x2 ... - vn*xn la plus petite possible. Donc il faut "feinter". Tu passes par une variable supplémentaire e, qui representerait la valeur absolue de N - v1*x1 - v2*x2 ... - vn*xn
donc le programme devient:
Minimiser e
sous:
e >= (N - v1*x1 - v2*x2 - v3*x3 ... - vn* xn)
e >= - (N - v1*x1 - v2*x2 - v3*x3 ... - vn* xn)
xi appartenant à {0,1}
si tu veux pas que la somme dépasse N, il faut mettre
Minimiser e
sous:
e >= (N - v1*x1 - v2*x2 - v3*x3 ... - vn* xn)
e >= 0
xi appartenant à {0,1}
donc:
1° tu veux que la somme puisse dépasser N ou pas?
2° tu as surement des outils écrits en C qui résolvent ça, une fois que tu as explicité ton problème sous cette forme (comme quelqu'un l'a dit il faut voir la perf oncalc aussi)
3° sans s'occuper de cette forme, on peut pondre un algorithme branch&bound qui peut éviter de lister les 2^n possibilités.