検索
ホームページJava&#&チュートリアル部分集合和問題の詳細な例

部分集合和問題の詳細な例

Jul 03, 2017 am 11:03 AM
動的プログラミングサブセット質問

注: 「部分集合と問題」の研究が十分に深くないため、この記事には動的計画法の再帰式の説明に不明確な記述や誤りがある可能性があります。見つけた場合はご指摘いただければ幸いです。

部分集合和問題は次のように説明できます: nの正の整数W=(w1, w2, …, wn)と正の整数を仮定すると、 M ∑wi=M,i∈I[1] となるような I⊆{1, 2, 3, ..., n}, を見つける必要があります。部分集合和問題の一般的な説明を与える例を取り上げます: 正の整数 M=5 が与えられたとき、集合 W=(1, 2, 3, 4, 5) は存在しますか W のサブセット I。サブセット I 内の要素の合計が M に等しい。この例では、明らかにサブセット I=(2, 3)。

問題の定義: 正の整数

W, s[i, j] が与えられた場合、正の整数の集合 S=(w1, w2, w3, …, wn) iS の部分集合を表し、j は部分集合 i の合計を表します。 Sのある集合iの要素の和j=Mであれば、つまり問題には解があります。

例:

S=(7, 34, 4, 12, 5, 3), W=6Sの部分集合はありますか、その要素の合計は等しいWへ。

この問題には多くの解決策もあります。この記事では、動的計画法の考え方を使用して解決するため、再帰的な公式を導出する必要があります。集合

S を継続的に小さな集合に分割します。これが 動的プログラミングの最初のステップです: 部分問題を定義します。集合 S の最小の集合は空集合です。 もちろん、空集合は存在せず、その要素の合計は j=0 に等しいです。空のセットが対象となります。

この表の列は集合内の要素の合計を表しており、最大でも要素Wまでしか到達できませんが、Wより大きい場合はもちろん意味がありません。 j=6列に1が表示されていれば、問題の解が得られます。この行は、最初の i (i を含む) 要素で構成されるサブセットを表します (この文は少し疑わしいかもしれません。すべての状況をスキャンすることは可能ではないでしょうか? それから読み続けてください)。 i=0は空集合を意味します。

j=6のとき、空集合状況はであると定義します。次に、 j=0 の場合、これは任意の部分集合の合計に当てはまります (空集合はその部分集合です)。したがって、フォームには以下に示すように入力が続けられます。

これらは実際には動的プログラミングの 3 番目のステップ、つまり初期状態の定義です。状態計画の 2 番目のステップは、状態遷移ルール​​、つまり状態間の再帰的な関係を定義することです。

s[i, j]

iは、最初のi部分集合(にはiが含まれる)を表す。実際には、ここから 2 つの部分に分割します:

1)

i 番目の要素の最初の i サブセット、つまり s[i - 1, j] を除きます。 ;

2)

i 番目の要素の最初の i サブセットが含まれます。
1)の状況では、最初のi - 1集合要素の合計がjに等しい場合、最初のiの部分集合要素が存在することが分かりやすいです。 合計は j に等しい。

理解が難しいのは、2)の状況です。 2 番目のケースについて明らかにできることの 1 つは、s[i,数学で特別値法を使用する場合、例えば集合(3, 34, 9)では、要素の合計がに等しい特定のサブセットは存在しますか? 37、この時点では i=2 (サブセットは (3, 34))、j = 37、この時点では " には最初の が含まれますi iサブセットこの場合、s[2, 37] => s[2, 37 - 34] = s[2, 3]、サブセット(3 , 34) もちろん、要素の合計が 3 に等しい部分集合があります。次に、 j = 36, s[2, 36] => s[2, 36 - 34] = s[2, 2], サブセット (3, 34) 明らかに要素の合計が 2 に等しいサブセットはありません。 j = 1, s[2, 1] => s[2, 1 - 34] = s[2, -32], j - wi s[2, 1] => s[2 - 1, 1] = s[1, 1]、そのサブセット要素の間にサブセット (3) は明らかに存在しません。合計は1となります。 要約すると、再帰式は次のとおりです: このアルゴリズムをコードに実装する前に、まず再帰式を通じて上記の行列を埋めます。 ①i = 1、このときの部分集合は(7)j = 1

j ∉(∅)

、選択状況

2) => [0 , 1] || s[1, -6]

(i = 0は空集合を表します)。明らかに s[1, 1] = 0 です。

②i = 1, このときの部分集合は(7), j = 2, j ∉ (∅), 選択状況2) => s[0, 2 ] | s[1, -5] (i = 0 は空集合を意味します)。明らかに s[1, 2] = 0 です。

I=1、この時点でサブセットは(7)j=6、j(∅)、選択状況2)=&gtです。 ; s[0, 6] || s[1, -1] (i = 0は空集合を表します)。明らかに s[1, 6] = 0 です。

最終的な埋め込みは以下のようになります:

引き続き最後の行を埋めます:

①i = 6,

このときの部分集合は

(7, 34, 4, 12, 5, 3), j = 1, j ∉ (7, 34, 4, 12, 5), 選択状況 2) => s[5, 1] || s[6, -2] (i = 0は空集合を表します)。明らかに s[6, 1] = 0 です。 ②i = 6,

このときの部分集合は

(7, 34, 4, 12, 5, 3), j = 2, j ∉ (7, 34, 4, 12 , 5)、選択状況 2) => s[5, 1] || s[6, -1] (i = 0 は空集合を意味します)。明らかに s[6, 2] = 0 です。 ③i = 6,

このときの部分集合は

(7, 34, 4, 12, 5, 3), j = 3, j ∉ (7, 34, 4, 12 , 5)、選択ケース 2) => s[5, 1] ||明らかに s[6, 3] = 1 です。

⑥i = 6,

このときの部分集合は

(7, 34, 4, 12, 5, 3), j = 6, j ∉ (7, 34, 4, 12) 、 5)、選択状況 2) => s[5, 6] || s[6, 3]。明らかに s[6, 6] = 1 です。

Java

 1 package com.algorithm.dynamicprogramming; 2  3 import java.util.Arrays; 4  5 /** 6  * 子集和问题 7  * Created by yulinfeng on 7/2/17. 8  */ 9 public class SubsetSumProblem {10 11     public static void main(String[] srgs) {12         int[] sets = {7, 34, 4, 12, 5, 3};13         int sum = 87;14         boolean isExistSubSet = subsetSumProblem(sets, sum);15         System.out.println("集合" + Arrays.toString(sets) + "是否存在子集的和等于" + sum + ":" + isExistSubSet);16     }17 18     private static boolean subsetSumProblem(int[] sets, int sum) {19         int row = sets.length + 1;20         int col = sum + 1;21         int[][] solutionMatrix = new int[row][col];22         solutionMatrix[0][0] = 1;23 24         /**25          *    0 1 2 3 4 5 626          * 0 |1|0|0|0|0|0|0|27          * 1 |x|x|x|x|x|x|x|28          * 2 |x|x|x|x|x|x|x|29          * 3 |x|x|x|x|x|x|x|30          * 3 |x|x|x|x|x|x|x|31          * 4 |x|x|x|x|x|x|x|32          * 5 |x|x|x|x|x|x|x|33          * 6 |x|x|x|x|x|x|x|34          */35         for (int i = 1; i = 0 && solutionMatrix[i][j - sets[i - 1]] == 1) {59                     solutionMatrix[i][j] = solutionMatrix[i][j - sets[i - 1]];60                 } else {61                     solutionMatrix[i][j] = 0;62                 }63 64                 if (j == col - 1 && solutionMatrix[i][j] == 1) {65                     return true;66                 }67             }68         }69 70         return false;71     }72 }

  Python3

 1 def subset_sum_problem(sets, sum): 2     row = len(sets) + 1 3     col = sum + 1 4     solutionMatrix = [[0 for col in range(col)] for row in range(row)] 5     solutionMatrix[0][0] = 1 6     for i in range(1, col): 7         solutionMatrix[0][i] = 0 8  9     for j in range(1, row):10         solutionMatrix[j][0] = 111         for k in range(1, col):12             solutionMatrix[j][k] = solutionMatrix[j - 1][k]13             if solutionMatrix[j][k] == 1:14                 solutionMatrix[j][k] = solutionMatrix[j][k]15             elif (k - sets[j - 1] >= 0) and (solutionMatrix[j][k - sets[j - 1]] == 1):16                 solutionMatrix[j][k] = solutionMatrix[j][k - sets[j - 1]]17             else:18                 solutionMatrix[j][k] = 019             if k == col - 1 and solutionMatrix[j][k] == 1:20                 return True21 22     return False23 24 sets = [7, 34, 4, 12, 5, 3]25 num = 626 is_exist = subset_sum_problem(sets, num)27 print(is_exist)


以上が部分集合和問題の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Java開発のどの側面がプラットフォームに依存していますか?Java開発のどの側面がプラットフォームに依存していますか?Apr 26, 2025 am 12:19 AM

javadevelopmentisnotentirelylylypratform-IndopentDuetoseveralfactors.1)jvmvariationsaffectperformanceandbehavioracrossdifferentos.2)nativeLibrariesviajniintroducePlatform-specificissues.3)giaiasystemsdifferbeTioneplateplatifflics.4)

さまざまなプラットフォームでJavaコードを実行するときにパフォーマンスの違いはありますか?なぜ?さまざまなプラットフォームでJavaコードを実行するときにパフォーマンスの違いはありますか?なぜ?Apr 26, 2025 am 12:15 AM

Javaコードは、さまざまなプラットフォームで実行するときにパフォーマンスの違いがあります。 1)JVMの実装と最適化戦略は、OracleJDKやOpenJDKなどとは異なります。 2)メモリ管理やスレッドスケジューリングなどのオペレーティングシステムの特性もパフォーマンスに影響します。 3)適切なJVMを選択し、JVMパラメーターとコード最適化を調整することにより、パフォーマンスを改善できます。

Javaのプラットフォームの独立性の制限は何ですか?Javaのプラットフォームの独立性の制限は何ですか?Apr 26, 2025 am 12:10 AM

java'splatformindepentedencehaslimitationsincludingporformanceoverhead、versioncompatibulisisues、changleSwithnativeLibraryIntegration、プラットフォーム固有の機能、およびjvminStallation/maintenation。

プラットフォームの独立性とクロスプラットフォーム開発の違いを説明します。プラットフォームの独立性とクロスプラットフォーム開発の違いを説明します。Apr 26, 2025 am 12:08 AM

PlatformEndependEncealLowsProgramStorunonAnyPlatformWithOdification、whilecross-platformdevelopmentReadreessomeplatform-specificAdjustments.platformindependence、explifiedByjava、unableSiversAlexecutionButMayCompromperformance

ジャストインタイム(JIT)コンピレーションは、Javaのパフォーマンスとプラットフォームの独立性にどのような影響を与えますか?ジャストインタイム(JIT)コンピレーションは、Javaのパフォーマンスとプラットフォームの独立性にどのような影響を与えますか?Apr 26, 2025 am 12:02 AM

jitcompalilationinjavaenhancesperformance whelemaintaining formindepence.1)itdynamicallyTrantesiNTODENATIVEMACHINECODEATRUNTIME、最適化されたコードを最適化すること、

Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Apr 25, 2025 am 12:23 AM

javaispopularforsoss-platformdesktopapplicationsduetoits "writeonce、runaynay" philosophy.1)itusesbytecodatiTatrunnanyjvm-adipplatform.2)ライブラリリケンディンガンドジャヴァフククレアティック - ルルクリス

Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Apr 25, 2025 am 12:22 AM

Javaでプラットフォーム固有のコードを作成する理由には、特定のオペレーティングシステム機能へのアクセス、特定のハードウェアとの対話、パフォーマンスの最適化が含まれます。 1)JNAまたはJNIを使​​用して、Windowsレジストリにアクセスします。 2)JNIを介してLinux固有のハードウェアドライバーと対話します。 3)金属を使用して、JNIを介してMacOSのゲームパフォーマンスを最適化します。それにもかかわらず、プラットフォーム固有のコードを書くことは、コードの移植性に影響を与え、複雑さを高め、パフォーマンスのオーバーヘッドとセキュリティのリスクをもたらす可能性があります。

プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?Apr 25, 2025 am 12:12 AM

Javaは、クラウドネイティブアプリケーション、マルチプラットフォームの展開、および言語間の相互運用性を通じて、プラットフォームの独立性をさらに強化します。 1)クラウドネイティブアプリケーションは、GraalvmとQuarkusを使用してスタートアップ速度を向上させます。 2)Javaは、埋め込みデバイス、モバイルデバイス、量子コンピューターに拡張されます。 3)Graalvmを通じて、JavaはPythonやJavaScriptなどの言語とシームレスに統合して、言語間の相互運用性を高めます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター