[WEEK04] DAY27, 28

1918 ワード

DAY27


2021.11.27 SAT
日曜日まですべてブラウズ
月曜日のすべての問題を正しく理解する(チームコメント)
火曜日水曜日にアルゴリズムのテーマを復習します
  • グリンディ:問題の解決過程で、この段階で、一番いいものを選んで、それから一番いいものを選んで
  • です.
  • グリディ問題はソートしてゆっくり選択することです.ほとんどのグリディ問題はソートとともに解決された.
  • https://blog.naver.com/ndb796/221242106787
    ここで、「通常、ソート(Sort)技術は、極端な問題を処理するために使用され、例えば、デフォルトでは無条件に大きく、無条件に小さく、無条件に長く、または無条件に短く処理される.」この文章を読めば分かります.あ、だから並べ替えは一緒に従うんですね.
    グリディアルゴリズム>結局、私が考えている問題解決方法は最善の解決方法ではないと思いますか?私は一人で何が一番いいかをどう判断するか考えています.
    そしてコーチは返事をした.
    「それが一番だと言いたいなら、他の方法が一番ではないことを証明しなければなりません」
    .
    .

    DAY28


    2021.11.28 SUN

    コイン問題の解決


    9084硬貨(DP)



    コード#コード#

    import sys
    input = sys.stdin.readline
    
    testcase = int(input())
    for _ in range(testcase):
        n = int(input())
        coins = list(map(int, input().split()))
        m = int(input())
    
        dp = [0] * (m + 1)
        dp[0] = 1
    
        for coin in coins:
            for i in range(m + 1):
                # a_(i-k) 를 만드는 방법이 존재한다면 
                # 이전 경우의 수에 현재 동전으로 만들 수 있는 경우의 수를 더한다.
                if i >= coin:
                    dp[i] += dp[i - coin]
    
        print(dp[m])

    11047硬貨0(グリディ)


    この問題は正しく読めば簡単だ

    コード#コード#

    import sys
    n, money = map(int, sys.stdin.readline().split())
    
    coins = []
    for _ in range(n):
        coins.append(int(sys.stdin.readline()))
    coins.sort(reverse=True)
    
    count = 0
    for coin in coins:
        if coin == 0:
            break
        count += money // coin
        money = money % coin # 남은 잔액
    
    print(count)
    答えはもう出た.
    Kがコインより金額が小さいと大きな金額から回るのは効率的ではありません.
    Kがコインより小さい場合はcontinue(passまたはpop)の条件をつけたほうがいいです.