Algorytm odejmowania liczby lub sumy liczb jej tworzącą od zbioru liczb

0

Witam

Potrzebuję pomocy/pomysłu/podpowiedzi w napisaniu programu którego zadaniem jest odjęcie dowolnej liczby naturalnej lub sumy liczb które ją tworzą od zbioru liczb naturalnych, tak aby zbiór po operacji odjęcia posiadał jak najmniejsze odchylenie .

Czyli mamy zbiór

10,5,3

Odejmowaną liczbą jest 7

Rozkladamy liczbę 7 = 6 + 1

10 - 6, 5-1, 3

4,4,3

Mam nadzieję, że wyraziłem się dosyć jasno o jaki problem chodzi.

0

Nie wiem czy istnieje efektywne rozwiązanie tego problemu dla dużych zbiorów.

0

Zbiór będzie mały maksymalnie 8 elementowy

0

Ja chyba nie rozumiem co tu jest inputem a co masz policzyć. Masz wyznaczyć taką liczbę? Masz wyznaczyc taki rozkład tej liczby?

0
  1. Liczba
  2. Obliczasz sumę odchyleń (double) Sum
  3. Znajdujesz maksymalne odchylenie Max w pozycji Pos
  4. Obliczasz Delta=Liczba*Max/Sum
  5. Zmniejszasz/Zwiększasz pozycje Pos o Delta
  6. Zmniejszasz Liczba o Delta
  7. Jeżeli Liczba>0 powtarzasz od punktu 2
#include <iostream>
#include <cmath>
using namespace std;
 
void show(int tb[],size_t size)
{
   for(size_t i=0;i<size;++i) cout<<(","+!i)<<tb[i];
   cout<<endl;
}
 
void divide(int tb[],size_t size,int ext)
{
   show(tb,size);
   while(ext>0)
   {
      double avg=0;
      for(size_t i=0;i<size;++i) avg+=tb[i];
      avg/=size;
      size_t imax=0;
      double dif=0,vmax=0;
      for(size_t i=0;i<size;++i)
      {
         double tmp=fabs(avg-tb[i]);
         dif+=tmp;
         if((!i)||(tmp>vmax))
         {
            vmax=tmp;
            imax=i;
         }
      }
      int chg=(int)round(max(1.0,dif*ext/(size*size)));
      ext-=chg;
      if(tb[imax]>avg) tb[imax]-=chg; else tb[imax]+=chg;
      show(tb,size);
   }
}
 
int main()
{
   int tb[]={10,5,3};
   divide(tb,sizeof(tb)/sizeof(*tb),7);
   return 0;
}

https://ideone.com/nt6bIc

1 użytkowników online, w tym zalogowanych: 0, gości: 1