#include int somme_sous_ensemble(int t[],int m) // rend t[1]+t[4]+t[8] si m=2+16+256 { int s=0,i; if(0) { for(i=0;i<32;i++) if((1<>i)&1) s+=t[i]; } else { for(i=0;m;i++,m>>=1) if(m&1) s+=t[i]; } return s; } void aff_somme_sous_ensemble(int t[],int m) // printf("%d+%d+%d=%d\n",t[1],t[4],t[8],...) si m=2+16+256 { int s=0,i; for(i=0;m;i++,m>>=1) if(m&1) printf("%d%c",t[i],m==1?'=':'+'), s+=t[i]; printf("%d\n",s); } int sous_ensemble_de_somme_donnee(int t[/*n+1*/],int s) // rend m tel que somme_sous...(t,m)=s { int m; for(m=0;;m++) if(somme_sous_ensemble(t,m)==s) return m; } int main() { int n=20, t[n+1], i, s=t[n]=(n/4)<<16, z=1; for(i=0;i< n;i++) t[i]=z=(z*12345+1)&0xffff; for(i=0;i<=n;i++) printf("%d ",t[i]); printf("\n"); int m=sous_ensemble_de_somme_donnee(t,s); aff_somme_sous_ensemble(t,m); return 0; }