首页 > 试题广场 >

数位染色

[编程题]数位染色
  • 热度指数:3994 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红拿到了一个正整数 。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。
她不知道能不能达成目标。你能告诉她吗?

输入描述:
一个正整数 



输出描述:
如果小红能按要求完成染色,输出"Yes"。否则输出"No"。
示例1

输入

1234567

输出

Yes

说明

将3、4、7染成红色即可,这样3+4+7=1+2+5+6
示例2

输入

23

输出

No

说明

显然无论如何都不能完成染色。
这题就是0-1背包,看物品能否恰好将背包装满。物品的体积为每位上的数值,背包为每位数值求和的一半。
#include <iostream>
#include <vector>
using namespace std;

int main() {

long long x; cin>>x;
vector<int> nums;
int sum=0;
while(x){
    int t = x%10;
    nums.push_back(t);
    sum += t;
    x /= 10;
}
if((sum&1)==1) cout<<"No";
else{
    int capacity = sum>>1;
    vector<bool> dp(capacity+1, false);
    dp[0] = true;
    for(int v : nums){
        for(int j=capacity; j>=v; j--){
            if(dp[j-v]){
                dp[j] = dp[j-v];
            }
        }
    }
    cout<<(dp[capacity] ? "Yes" : "No");
}
}



发表于 2024-01-05 13:37:40 回复(0)
补充一个python版
def ans():
    nums = list(map(int , list(input())))
    sum_num = sum(nums)
    if sum_num % 2 == 1:
        print("No")
        return
    else:
        target = sum_num // 2
    dp = [0] * (target+1)
    dp[0] = 1
    for n in nums:
        j = target
        while j >= n:
            dp[j] += dp[j-n]
            j -= 1
    res = "Yes" if dp[target] else "No"
    print(res)
ans()


发表于 2021-11-04 13:23:11 回复(1)
补充JAVA版本
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long num = in.nextLong();
        String[] numStrs = Long.toString(num).split("");
        int[] nums = new int[numStrs.length];
        int sum = 0;
        for (int i = 0; i < numStrs.length; i++) {
            nums[i] = Integer.parseInt(numStrs[i]);
            sum += nums[i];
        }
        if (sum % 2 == 1) {
            System.out.println("No");
        } else {
            int target = sum / 2;
            int[] dp = new int[target + 1];
            dp[0] = 1;
            for (int n : nums) {
                int j = target ;
                while (j >= n) {
                    dp[j] += dp[j - n];
                    j--;
                }
            }
            if (dp[target] != 0) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }
}


发表于 2022-03-28 22:16:04 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main(){
    long long x;
    int sum = 0;
    vector<int> bit;
    cin >> x;
    while(x != 0){
        bit.push_back(x % 10);
        sum += x % 10;
        x /= 10;
    }
    if(sum % 2 == 0){
        int k = sum / 2;
        vector<int> dp(k + 1, 0);//0 1背包模板
        for(int i = 0; i < bit.size(); ++i){
            for(int j = k; j - bit[i] >= 0;--j){
                dp[j] = max(dp[j], dp[j - bit[i]] + bit[i]);
            }
        }
        if(dp[k] == k)
            cout << "Yes";
        else
            cout << "No";
    }
    else
        cout << "No";
    return 0;
}
发表于 2022-03-14 10:41:36 回复(0)

问题信息

难度:
4条回答 1272浏览

热门推荐

通过挑战的用户

查看代码
数位染色