类似背包问题,sum为所有位数之和,k=sum/2,将k看成背包容量,将原背包问题中的求最值问题看作存在性问题;dp[j]为背包剩余量。第i位数有选或不选两种情况。

dp[j]=(dp[j+m[i]]||dp[j]);

#include<iostream>
using namespace std;

int main(){
    long long x;
    bool dp[100]={0};
    int m[20]={0};
    int sum=0;
    int n=0;
    cin>>x;
    while(x!=0){
        ++n;
        m[n]=x%10;
        sum+=x%10;
        x/=10;
    }
    if(sum%2==0){
        int k=sum/2;
        dp[k]=1;
        for(int i=0;i<n;++i){
            for(int j=0;j+m[i]<=k;++j){
                dp[j]=dp[j+m[i]]||dp[j];
            }
        }
        if(dp[0]==1)
            cout<<"Yes";
        else
            cout<<"No";
    }
    else
        cout<<"No";
    return 0;
}