【題解】ZeroJudge d890: 3.禮物分配(gift)

題目敘述:https://zerojudge.tw/ShowProblem?problemid=d890

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    int n, k;
    while (cin >> n >> k){
        int gifts[n], total = 0;
        for (int i = 0; i < n; i++){
            cin >> gifts[i];
            total += gifts[i];
        }
        int half = total/2;
        int dp[half+1];
        memset(dp, 0, sizeof(dp));
        
        for (int i = 0; i < n; i++){
            for (int j = half; j >= gifts[i]; j--){
                if (gifts[i] + dp[j-gifts[i]] > dp[j]){
                    dp[j] = gifts[i] + dp[j-gifts[i]];
                }
            }
        }
        cout << dp[half] << " " << total - dp[half] << "\n";
    }
}

Python code (credit: Amy Chou)
【注意】NA (60%),第一筆和最後一筆測資 TLE

import sys
lines = sys.stdin.readlines()

n, k = map(int, lines[0].split())
gifts = [int(line) for line in lines[1:]]
total = sum(gifts)
    
half = total // 2
dp = [0 for _ in range(half+1)]
for i in range(n):
    for j in range(half, gifts[i]-1, -1):
        if (gifts[i] + dp[j - gifts[i]] > dp[j]):
            dp[j] = gifts[i] + dp[j - gifts[i]]
            
print(dp[half], total - dp[half])
分享本文 Share with friends