(01 programmation dynamique du sac à dos) lintcode92 · problème de sac à dos

sujet

Description
Choisissez un certain nombre d'articles parmi n articles et mettez-les dans le sac à dos. Combien peut-il contenir au maximum ? Supposons que la taille du sac à dos soit m et que la taille de chaque article soit A_{i}A i

(Chaque élément ne peut être sélectionné qu'une seule fois)

Échantillon

Exemple 1 :
Entrée :
tableau = [3,4,8,5]
taille du sac à dos = 10
Sortie :
9
Explication :
Charger 4 et 5.

Exemple 2 :
Entrée :
tableau = [2,3,5,7]
taille du sac à dos = 12
Sortie :
12
Explication :
Charger 5 et 7.

analyser

Les éléments ne peuvent pas être divisés et chaque élément n'en a qu'un, le problème classique du sac à dos 01, un tableau d'états bidimensionnel direct, la ligne représente la charge, la colonne représente le nombre d'éléments, la valeur est de type booléen et le la valeur 1 signifie que les i premiers éléments peuvent être combinés en poids j.

1. La dernière étape

Le fait de prendre ou non l'article actuel peut constituer la capacité de charge du sac à dos actuel. L'article actuel est le nième article. Lorsque vous ne le prenez pas, voyez si les n-1 premiers articles peuvent constituer la capacité de charge Au moment de le prendre, regardez les premiers articles n-1. Chaque article peut-il représenter le poids du sac à dos actuel moins le poids de l'article actuel ?

2. Équation de transfert

f[i][j]={f[i][j-1]||f[i-poids actuel de l'article][j-1]}(i>=poids actuel de l'article)

section de codes

1. Initialisation

f[0][j]=true Satisfait la capacité portante 0 en ne prenant pas l'objet
f[i][0]=false Le poids supérieur à 0 ne doit pas être trouvé en ne prenant pas l'objet

    	int len=A.size();
    		//承重 第几个物品 
    	vector<vector<bool> > f(m+1,vector<bool>(len+1,false));	//状态 
    	f[0][0]=true;
		for(int i=1;i<=m;i++)		//初始化 
			f[i][0]=false;
		for(int i=1;i<=len;i++)
			f[0][i]=true;
2. Noyau de jauge dynamique
		int ans=0;	
		for(int i=1;i<=m;i++)		//动规核心 
		{
    
    
			for(int j=1;j<=len;j++)
			{
    
    
				f[i][j]=f[i][j-1];
				if(i>=A[j-1])
				{
    
    
					f[i][j]=f[i][j]||f[i-A[j-1]][j-1];
				}
				if(f[i][j])
					ans=i;
			}
		}

code complet

class Solution {
    
    
public:
    int backPack(int m, vector<int> &A) {
    
    
    	int len=A.size();
    		//承重 第几个物品 
    	vector<vector<bool> > f(m+1,vector<bool>(len+1,false));	//状态 
    	f[0][0]=true;
		for(int i=1;i<=m;i++)		//初始化 
			f[i][0]=false;
		for(int i=1;i<=len;i++)
			f[0][i]=true; 

		int ans=0;	
		for(int i=1;i<=m;i++)		//动规核心 
		{
    
    
			for(int j=1;j<=len;j++)
			{
    
    
				f[i][j]=f[i][j-1];
				if(i>=A[j-1])
				{
    
    
					f[i][j]=f[i][j]||f[i-A[j-1]][j-1];
				}
				if(f[i][j])
					ans=i;
			}
		}
		
		return ans; 
    }
};

Résumer

Problème de sac à dos, la charge doit être remplacée dans l'état, 01 problème de sac à dos, une autre dimension représente le nombre d'articles, s'il s'agit d'un sac à dos complet, l'autre dimension représente le nombre d'articles à emporter, car il y a beaucoup d'articles dans un sac à dos complet . Le même élément
, cette méthode est tle, et la méthode ac sera mise à jour ultérieurement

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46035615/article/details/124097492
conseillé
Classement