她不知道能不能达成目标。你能告诉她吗?
一个正整数,
如果小红能按要求完成染色,输出"Yes"。否则输出"No"。
1234567
Yes
将3、4、7染成红色即可,这样3+4+7=1+2+5+6
23
No
显然无论如何都不能完成染色。
#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"); } }
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()
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"); } } } }
#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; }