Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
Enunț
Având la dispoziție n (1<=n<=20) tipuri de bancnote, fiecare tip în număr nelimitat, să se afle numărul minim de bancnote ce pot fi utilizate pentru a plăti o sumă S<=3000. Se știe că se dispune de bancnota de o unitate.
#include <iostream>
#include <algorithm>
using namespace std;
int suma[3000],bancnota[20], n, S, sol[3000];
void plata()
{
int i, j;
suma[0]=0;
for (j=1;j<=S;j++)
{
suma[j] =4000;
for (i=1;i<=n;i++)
if (bancnota[i] <= j && 1+suma[j - bancnota[i]]<suma[j])
{
suma[j]=1+suma[j - bancnota[i]];
sol[j]=bancnota[i];
}
}
cout <<"Numarul minim de bancnote: "<<suma[S]<<endl;
}
void constructSol(int k)
{
if (k > 0)
{
constructSol(k - sol[k]);
cout<<sol[k]<<" ";
}
}
int main()
{
cout << "n= ";
cin >> n;
cout << "S= ";
cin >> S;
for (int i=1;i<=n;i++)
{
cout <<"bancnota["<< i <<"]=";
cin >>bancnota[i];
}
plata();
cout <<"Bancnotele selectate: ";
constructSol(S);
return 0;
}
n=4 S=7
bacnota[1]=1
bancnota[2]=3
bancnota[3]=5
bancnota[4]=10
Noi trebuie sa determinăm suma[7]. Pentru aceasta vom determina suma[0], suma[1], suma[2], … ,suma[7].
Evident suma[0]=0;
Pentru a determina suma[1] : suma[1]=4000 initial (suma noastra e mai mica decat 3000 deci vom initializa suma[1] cu o valoare mai mare)
i=1 : suma[1]=1+suma[1-1]=1; sol[1]=1;
pentru i de la 2 la 4 bancnota[i]>j
Acum vom determina suma[2]
suma[2]=4000;
i=1 : suma[2]=1+suma[1]=2; sol[2]=1;
pentru i de la 2 la 4 bancnota[i]>j
j=3 => suma[3]=4000;
i=1 : suma[3]=1+suma[3-1]=1+suma[2]=3; sol[3]=1;
i=2 : suma[3]=1+suma[3-bancnota[2]]=1+suma[3-3]=1; sol[3] = 2;
pentru i de la 3 la 4 avem bancnota[i]>j
j=4 => suma[4]=4000;
i=1 : suma[4]= 1+suma[3]=1+1=2; sol[4]=1;
pentru i=2 1+suma[4-bancnota[2]]=suma[4]=2 iar pentru i de la 3 la 4 avem bancnota[i]>j
astfel suma[5]=1; sol[5]=3; suma[6]=2; sol[6]=1; suma[7]=3; sol[7]=1
Pentru a construi solutia : k=7 => constructsol(7-1) si retinem pe stiva 1 => constructsol(6-1) si retinem pe stiva 1 => constructsol(5-5) si retinem pe stiva 5 => constructsol (0) deci afiseam 5 1 1
#include<iostream>
using namespace std;
int n,i,j,aux,s,a[100];
main()
{
cout<<"Suma=";cin>>s;
cout<<"Numarul de bancnote:";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";cin>>a[i];
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
if(a[i]<a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
}
i=1;
cout<<s<<endl;
do
{
if(s/a[i]>0)
cout<<s/a[i]<<" bancnote cu valoarea "<<a[i]<<endl,s=s%a[i];
i++;
}
while(i<=n);
return 0;
}
Pentru suma s=67 si bancnote de 1, 5, 10, 50, 100 lei
i=1 s/a[i]=67/100=0
i=2 s/a[i]=67/50=1 => 1 bancnota cu valoarea de 50 de lei si s devine 67%50=17
i=3 s/a[i]=17/10=1 => 1 bancnota cu valoarea de 10 lei si s devine 17%10=7
i=4 s/a[i]=7/5=1 => 1 bancnota cu valoarea de 5 lei si s devine 7%5=2
i=5 s/a[i]=2/1=2 => 2 bancnote cu valoarea de 1 leu