Pythonで分数ナップサック問題を実装するプログラム
同じ長さの重みと値、および別の値容量の2つのリストがあるとします。 weights[i]とvalues[i]は、i番目の要素の重みと値を表します。したがって、最大で容量の重みを取得でき、比例した値でアイテムの重みの一部を取得できる場合は、取得できる値の最大量を見つける必要があります(最も近い整数に切り捨てられます)
したがって、入力が重み=[6、7、3]値=[110、120、2]容量=10のような場合、出力は178になります。
これを解決するには、次の手順に従います-
-
res:=0
-
重みと値を使用してペアPのリストを作成し、重みごとの値に基づいて並べ替えます
-
Pのペアごとに、実行します
- cif容量が0の場合、
-
ループから出てきます
-
-
pair [0]>容量の場合、
-
res:=res +(pair [1] /(pair [0] / capacity)
の商 -
容量:=0
-
-
それ以外の場合、pair [0] <=容量の場合、
-
res:=res+ペア[1]
-
容量:=容量-ペア[0]
-
- cif容量が0の場合、
-
resのリターンフロア値
-
理解を深めるために、次の実装を見てみましょう-
例
class Solution: def solve(self, weights, values, capacity): res = 0 for pair in sorted(zip(weights, values), key=lambda x: - x[1]/x[0]): if not bool(capacity): break if pair[0] > capacity: res += int(pair[1] / (pair[0] / capacity)) capacity = 0 elif pair[0] <= capacity: res += pair[1] capacity -= pair[0] return int(res) ob = Solution() weights = [6, 7, 3] values = [110, 120, 2] capacity = 10 print(ob.solve(weights, values, capacity))
入力
[6, 7, 3],[110, 120, 2],10
出力
230
-
行列の転置を見つけるPythonプログラム
この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 行列が与えられた場合、転置を同じ行列に格納して表示する必要があります。 行列の転置は、行を列に、列を行に変更することで得られます。つまり、A行列の転置はA[i][j]をA[j][i]に変更することで得られます。 以下に示す実装を見てみましょう- 例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): &nbs
-
配列の合計を見つけるPythonプログラム
この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力として配列が与えられた場合、与えられた配列の合計を計算する必要があります。 ここでは、ブルートフォースアプローチに従うことができます。つまり、リストをトラバースし、各要素を空の合計変数に追加します。最後に、合計の値を表示します。 以下で説明するように、組み込みの合計関数を使用して別のアプローチを実行することもできます。 例 # main arr = [1,2,3,4,5] ans = sum(arr,n) print ('Sum of the array is '