Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで最適化された方法で果物を埋めるために必要な最小コストを見つけるためのプログラム


果物と呼ばれるリストと、別の2つの値kとcapがあるとします。各fruits[i]に3つの値[c、s、t]がある場合、これは、fruit iのコストがそれぞれcであり、それぞれのサイズがsであり、合計tがあることを示します。 kは、容量上限のフルーツバスケットの数を表します。フルーツバスケットに次の制約をこの順序で入力します-

  • 各バスケットには同じ種類の果物しか入れられません
  • 各バスケットはできるだけいっぱいにする必要があります
  • 各バスケットはできるだけ安くする必要があります

したがって、できるだけ多くのバスケットを満たすために必要な最小コストを見つける必要があります。

したがって、入力がフルーツ=[[5、2、3]、[6、3、2]、[2、3、2]] k =2 cap =4の場合、出力は12になります。 2つのフルーツ0を取ることができます。これは、これら2つを使用すると、最初のバスケットを合計サイズ2 + 2 =4でいっぱいにすることができ、コストは5 + 5=10になるためです。次に、フルーツ2の方が安いので1つ使用します。これには2ユニットかかります。

これを解決するには、次の手順に従います-

  • オプション:=新しいリスト
  • 果物の各トリプレット(c、s、t)について、
    • t> 0の間、do
      • fnum:=(cap / s)とtの最小フロア
      • fnumが0と同じ場合、
        • ループから抜け出す
      • bnum:=t/fnumのフロア
      • オプションの最後にトリプレット(cap --fnum * s、fnum * c、bnum)を挿入します
      • t:=t --bnum * fnum
  • ans:=0
  • 並べ替えられたオプションのリストの各トリプレット(left_cap、bcost、bnum)について、
      を実行します。
    • bfill:=kとbnumの最小値
    • ans:=ans + bcost * bfill
    • k:=k --bfill
    • kが0と同じ場合、
      • ループから抜け出す
  • 回答を返す

理解を深めるために、次の実装を見てみましょう-

def solve(fruits, k, cap):
   options = []
   for c, s, t in fruits:
      while t > 0:
         fnum = min(cap // s, t)
         if fnum == 0:
            break
         bnum = t // fnum

         options.append((cap - fnum * s, fnum * c, bnum))
         t -= bnum * fnum
   ans = 0
   for left_cap, bcost, bnum in sorted(options):
      bfill = min(k, bnum)
      ans += bcost * bfill
      k -= bfill
      if k == 0:
         break

   return ans

fruits = [[5, 2, 3],[6, 3, 2],[2, 3, 2]]
k = 2
cap = 4
print(solve(fruits, k, cap))

入力

[[5, 2, 3],[6, 3, 2],[2, 3, 2]], 2, 4

出力

12

  1. Pythonでスティックをカットするための最小コストを見つけるためのプログラム

    値nとcutsという配列があるとします。長さn単位の木の棒があると考えてください。スティックには0からnまでのラベルが付いています。ここで、cuts [i]は、カットできる位置を表します。順番にカットする必要がありますが、カットの順番は自由に変更できます。ここで、1カットのコストはカットするスティックのサイズであり、合計コストはすべてのカットのコストの合計です。削減の最小総コストを見つける必要があります。 したがって、入力がn =7、cuts =[5,1,4,3]の場合、出力は16になります。これは、[3,5,1,4]のように注文すると、最初に長さ7から3なので、コストは7です。次に、長さ3

  2. Pythonでフォルダからホームに戻るために必要な最小限のジャンプを見つけるためのプログラム

    フォルダに入力するパスがあるログがあるとすると、-のような異なる記号が存在する可能性があります。 ../:現在のフォルダから親フォルダに移動します。 (メインフォルダにいる場合は、場所を変更しないでください。) ./:現在のフォルダに残ります。 x /:xという名前の子フォルダーに移動します。 ログから、停止した最後のフォルダーからメインフォルダーに戻るために必要な操作の最小数を見つける必要があります。 したがって、入力がlogs =[Dir1 /、 Dir2 /、 ../、 Dir2 /、 Dir3 /、 ./]の場合、出力は3 画像から、家に着くには3回