Technology sharing

leetcode-dynamic programming-01 sacco dorsuali

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

unus,Duo dimensiva ordinata

1、status transitus aequationis

  • Noli itemsi : Deducitur ab dp[i - 1][j], hoc est, maximum valorem manticae cum captu j et non item i in eo. 1][j]. (Nam, cum pondus item i maius est quam pondus dorsualis j, item i in mantica mitti non potest, sic valor in mantica est idem quod prius.
  • Pone item i *: Ab dp[i - 1][j - weight[i]], dp[i - 1][j - weight[i]] est maxima capacitas manticae sine item i quando capacitas j - ponderis est. i] valorem, deinde dp[i - 1][j - weight[i]] + valor[i] (pretii item i) est maximus valor, posito item i in mantica

Sic formula recursiva: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

2. Initialization

(1) Incipiens a definitione dp[i][j], si capacitas manticae j est 0, id est, dp[i][0], cuiuscumque res selectae sunt, totus valor manticae esse debet 0 .

( 2 ) Res publica transitus aequationis dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + valor[i]); ex i-i derivatum esse videtur, ita initialized i cum 0 esse debet.

dp[0][j], hoc est: i est 0, cum deponenda item numero 0, maximum valorem quem dorsualem cuiusque capacitatis condere potest.

Tunc manifestum est, cum j < weight[0], dp[0][j] sit 0, eo quod capacitas mantica minor sit quam pondus item 0 numerati.

Cum j >= weight[0], dp[0][j] pretii esse debet [0], quia capacitas manticae capacitatis item numerus 0 retinendus est.

  1. for (int j = 0 ; j < weight[0]; j++) {
  2. dp[0][j] = 0;
  3. }
  4. // 正序遍历
  5. for (int j = weight[0]; j <= bagweight; j++) {
  6. dp[0][j] = value[0];
  7. }

(3) Alia subscripta initialization:

dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])

dp[1][1] = max(dp[0][1], dp[0][1- grave[i]] + valorem [i]) erit ad sinistram et supra,

Ideo debet initialized et ad quemlibet valorem apponi.

2. una dimensiva (ordinata volubilem)

1. In one-dimensionali dp ordinata, dp[j] significat: saccum cum capacitate j item cum maximo valore dp[j] ferre potest.

dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

2. Initialization

(1) dp[0]=0, quia maximum momentum rerum per manticam cum capacitate 0 ferri potest.

(2) Pone valorem rerum maius quam 0;Ut non sit pretii overwritten ab initialUt dp*Ordina initializationCum omnes initio 0

3. Traversal ordinem

Percurre in ordine retrogrado

Explicatio I: Valor in fine indices determinari debet, eam comparando cum valore praecedenti consecuto in gradu praecedenti percurso.

Exponi in 2: Mantica una tantum est pro quolibet mantica. Utrum hic saccus positus sit vel non se habeat ad statum sacculi prioris dexter pendens status est sacculi currentis. In codice, numerus a sinistris requiritur ad dextram aciem determinare, sic numerus in sinistro deleri non potest antequam numerus in dextro computatus est.

Explicatio III: Duae enim dimensiones, quas quisque novus dp numerus, quem habeo, a summo et sinistro provenit; Figuras re ipsa reliquit mihi sunt updated ( Laevum latus non iam est “originale” latus sinistrum!Hoc faciet aliquid duplici numero ), etsi cacumen adhuc originalis culmen habet, numerus incor- datus est.Et si percurramus a dextra ad sinistram in strato dorsuali (strato interiore), elementum a sinistris semper eritNovae valores non erunt overscripte priori operationi meae.ut recte obtineat.

3. Application

1. Dato ordine non vacuo, integros tantum positivos continens. Num possibile est hunc ordinem in duo subsellia scindere ut summa elementorum duorum copiarum aequalis sit?

Nota: elementa in unoquoque ordinata non excedunt 100 et magnitudo ordinata non excedunt 200

Exemplum 1:

  • Input: [1, 5, 11, 5].
  • Output: verum
  • Explicatio: Ordo potest dividi in [1, 5, 5] et [11].

resolvere;

Item I.

Pondus est nums[i], valor nums[i] est, et volumen manticae est summa/2.

Similia sunt I sacco dorsuali

Transitus rei publicae aequatio;

dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
  1. // 开始 01背包
  2. for(int i = 0; i < nums.size(); i++) {
  3. for(int j = target; j >= nums[i]; j--) {
  4. dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
  5. }
  6. }
  7. // 集合中的元素正好可以凑成总和target
  8. if (dp[target] == target) return true;

2. Est acervus lapidum, et cuiusvis lapidis pondus integer positivus est.

Quodlibet rotundum, binos scopulos carpe simul et confringe. Pondera lapidum sint x et y et x &lt;= y. Eventus deinde possibilis opprimendi sunt haec:

Si x==y, utraque saxa penitus conterentur;

Si x != y, lapis ponderis x omnino franget, lapisque ponderis y novum pondus habebit yx.

In fine, ad summum unus tantum lapis relictus erit. Redit hoc lapidis quam minimum pondus. Si lapides non desunt, 0 redditur.

Exemplum:

  • Input: [2,7,4,1,8,1]
  • Output: 1

resolvere;

Conantur lapides in duos strues ejusdem ponderis dividere, ita ut minimus lapis post collisionem remaneat

Tum in duos strues lapidum divide. Totum unius acervi lapidum pondus dp[scopum] est, et tota congeries rogi alterius summa est.

Cum scopo calculandum, scopo = sum / 2 quia rotundum est, sic summa - dp[scopa] maior esse debet quam vel aequalis dp[scopo]

Tum minimum pondus lapidis post ictum manens est - dp[scopus]

  1. for (int i = 0; i < stones.length; i++) {
  2. //采用倒序
  3. for (int j = target; j >= stones[i]; j--) {
  4. dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
  5. }
  6. }
  7. //结果
  8. sum - 2 * dp[target];

citatis:Code Random Notes