題目連結: https://zerojudge.tw/ShowProblem?problemid=b116

# 內容

假設有 N 個正整數 A [1], A [2],..., A [N],我們要在每一個數字之
前加入 + 號或 - 號使得它們的總和為 0。例如: 1, 2 及 3,我們可以得到
(-1)+(-2)+(+3)=0;但是對於 2, 2 及 1 則無法透過加入 + 號或 - 號使得它
們的總和為 0。

請你寫一個程式來判斷任意 N 個正整數是否可以透過加入 + 號或
- 號使得它們的總和為 0。

# 解題思路

問題能被化減成將 N 個正整數平均分成兩堆,若能剛好分成等值的兩堆即為 Yes,否則 No
所以,可以運用 DP 的方式,在這群數字中湊出 sum/2,即為 Yes

# 程式碼

#include <iostream>
#include <cstring>
using namespace std;
int t, m, total, half, dp[25005], num[105];
  
int main(){
    while (cin>>t>>m){
        while(t--){
            total = 0;
            for (int i = 0; i < m; i++){
                cin >> num[i];
                total += num[i];
            }
            half = total / 2;
            memset(dp, 0, sizeof(dp));
            for (int i = 0; i < m; i++){
                for (int j = half; j >= num[i]; j--){
                    dp[j] = max(dp[j], dp[j-num[i]] + num[i]);
                }
            }
            if(total == 2*dp[half])cout<<"Yes\n";
            else cout<<"No\n";
        }
    }
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay