Semaine 11 Affectation-E-Question facultative 11-1 Dongdong et ATM

sujet

Une banque envisage d'installer une machine de retrait d'espèces.

La machine peut envoyer des factures appropriées pour le montant d'argent requis.

La machine utilise exactement N billets de différentes dénominations, telles que D_k, k = 1,2, ..., N, et pour chaque dénomination D_k, la machine a n_k billets.

Par exemple,

N = 3 ,

n_1 = 10 , D_1 = 100 ,

n_2 = 4 , D_2 = 50 ,

n_3 = 5 , D_3 = 10

Cela signifie que la machine a 10 billets avec une dénomination de 100, 4 billets avec une dénomination de 50 et 5 billets avec une dénomination de 10.

Dongdong est en train d'écrire un programme de guichet automatique qui peut demander à la machine de livrer de l'argent en fonction du montant spécifique.

À noter que la trésorerie maximale calculée par ce programme est inférieure ou égale à la trésorerie qui peut être effectivement livrée en fonction de la facture disponible de l'équipement.

Contribution

L'entrée du programme provient de l'entrée standard. Chaque ensemble de données dans l'entrée représente une transaction spécifique, et son format est: Cash N n1 D1 n2 D2… nN DN où 0 <= Cash <= 100000 est le montant d'argent demandé, 0 <= N <= 10 est la dénomination des billets Quantité, 0 <= nk <= 1000 est le nombre de billets utilisables de dénomination Dk, 1 <= Dk <= 1000, k = 1, N. Les espaces peuvent apparaître librement entre les nombres dans l'entrée. Les données d'entrée sont correctes.

Production

Pour chaque ensemble de données, le programme imprimera le résultat sur la sortie standard sur une ligne distincte dans la ligne suivante.

Exemple d'entrée

735 3 4125 6 5 3350633
4500 30 6100 1 5 0
1735 0
0 3 10100 10 50 10 10

Exemple de sortie

735
630
0
0
0

Allusion

Le premier ensemble de données spécifie une transaction dans laquelle le montant en espèces demandé est 735. La machine contient 3 dénominations de billets: 4 billets 125, 6 billets 5 et 3 billets 350. La machine peut livrer le montant exact d'espèces requis.
Dans le second cas, la fourniture de factures de la machine ne peut pas atteindre le montant exact de trésorerie requis. Le montant maximum en espèces pouvant être livré est de 630. Veuillez noter qu'il existe de multiples possibilités pour combiner les billets de banque dans la machine pour correspondre aux espèces livrées.
Dans le troisième cas, la machine est vide et aucun liquide n'est livré. Dans le quatrième cas, le montant en espèces demandé est 0, de sorte que la machine ne délivre pas d'espèces.

Idées

1. Cette question peut être considérée comme un problème de sacs à dos multiples. Le nombre total de pièces à composer est considéré comme la capacité du sac à dos. Chaque pièce de dénomination différente est un objet, et son volume et sa valeur sont à la fois la valeur nominale de la pièce.
2. Un algorithme important qui doit être utilisé est le fractionnement binaire. Le fractionnement binaire peut diviser une dénomination en d'autres dénominations, et ces dénominations fractionnées peuvent combiner toutes les combinaisons qui peuvent être combinées par la dénomination d'origine, mais après le fractionnement, il peut être converti en un problème de sac à dos 01.
3. Une fois le fractionnement terminé, vous pouvez exécuter directement le sac à dos 01, et la capacité, la valeur et les autres variables correspondantes dans le sac à dos 01 doivent être modifiées de manière appropriée.

Code

#include<iostream>
int n[20];
int d[20];
int vv[10020];
int f[100020];
using namespace std;
int main()
{
    
    
	int cash,N; 
	while(scanf("%d",&cash)!=EOF)
	{
    
    
		scanf("%d",&N);
		for(int i=1;i<=N;i++)
		{
    
    
			scanf("%d",&n[i]);
			scanf("%d",&d[i]);
		}		
	int cnt=0;
	for(int i=1;i<=N;i++)
	{
    
    
		int t=n[i];
		for(int k=1;k<=t;k<<=1)
		{
    
    
			cnt++;
			vv[cnt]=k*d[i];
			t-=k;
		}
		if(t>0)
		{
    
    
			cnt++;
			vv[cnt]=t*d[i];
		}
	 } 	
	 for(int i=0;i<=cash;i++)
	 	f[i]=0;
	for(int i=1;i<=cnt;i++)
	{
    
    
		for(int j=cash;j>=vv[i];j--)
		{
    
    
			f[j]=max(f[j],f[j-vv[i]]+vv[i]);
		}
		}
		cout<<f[cash]<<endl;	
	}

	return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/alicemh/article/details/105893903
conseillé
Classement