前にした質問と似ていますが、条件としては[2 2 2 3 3 4 5]のように数字群があり、それらの数字は重複しているものもあります。グループ1とグループ2に分けて、合計値の差が必ずしもゼロになるわけではないことが注意です。
まだ途中のコードで、前と同様にコンビネーション関数を使って解こうと考えたのですが、かなり非効率な方法だなとおもいましたが、一応書いてみたコードが下記のものにになります。
該当のソースコード
import itertools min_diff = float('inf') num = int(input()) lis = [2 2 2 3 3 4 5] ##その他 数字群が様々あるが、、、 lis = [int(x) for x in lis ] lis = sorted(lis) group1=[] group2=[] for i in range(1,num): group1=[] group2=[] lis2 = lis.copy() for c1 in itertools.combinations(lis2, i): c1 = list(c1) group1=[x for x in c1] print(sum(group1)) for j in range(len(c1)): lis2.remove(c1[j])# ここでremoveの関数にはエラーが起こるが、、、 group2=lis2 diff =abs(sum(group1)-sum(group2)) if diff ==0: break elif diff< min_diff: min_diff = diff else: continue print(min_diff)
試したこと
他にも平均値を求めソートを使い、グループ1、グループ2に、小さい数字順に交互に入れていき、
平均値を超えた場合、余りをもう片方に入れて、合計値が大きいグループから小さいグループに、一番小さい数字を入れていくwhile文を作成したのですが、この最適化問題?では最小値が前回と同様になったらwhileを抜けると考えると、最小値が同じ数字(今回なら2)だと、ずっと交換し続けることになるので、うまく作成できませんでした。おそらくもっと効率のいい考え方があるのではと思うので、ご教授いただけたと思います。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。