题解 | 数组分组 0-1背包解决分组问题

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

#include <bits/stdc++.h>
using namespace std;

bool canAchieveTarget(vector<int>& nums, int target) {
    if(nums.size()==0) return target==0;

    int sum_neg=0,sum_pos=0;
    for(int i:nums){
        if(i<0) sum_neg+=i;
        else sum_pos+=i;
    }
    if(target<sum_neg || target>sum_pos) return false;

    int offset=-sum_neg;
    int total=sum_pos+offset;

    vector<vector<bool>>DP(nums.size()+1,vector<bool>(total+1,false));
    // for(int i=0;i<=nums.size();i++)
    DP[0][offset]=true;
    for(int i=1;i<=nums.size();i++){
        for(int j=0;j<=total;j++){
            DP[i][j]=DP[i-1][j] || DP[i][j];
            if(j>=nums[i-1] && j-nums[i-1]<=total)
            DP[i][j]=DP[i-1][j-nums[i-1]]||DP[i][j];
        }
    }
    return DP[nums.size()][target+offset];
}

int main() {
    int n;
    cin >> n;
    vector<int> a;
    vector<int> b;
    vector<int> other;
    int num;
    for (int i = 0; i < n; i++) {
        cin >> num;
        if (num % 5 == 0) {
            a.push_back(num);
        } else if (num % 3 == 0) {
            b.push_back(num);
        } else other.push_back(num);
    }
    int sum_a = 0, sum_b = 0, sum_other = 0;
    for (auto i : a) {
        sum_a += i;
    }
    for (auto i : b) {
        sum_b += i;
    }
    for (auto i : other) {
        sum_other += i;
    }
    int dis = abs(sum_a - sum_b);
    int target1, target2;
    int flag=(sum_other - dis) % 2;
    if (abs(flag) == 1) {
        cout << "false";
        return 0;
    }
    target1 = (sum_other - dis) / 2;
    target2 = target1 + dis;
    sort(other.begin(), other.end());
    if(canAchieveTarget(other, target1)){
        cout<<"true";
    }else cout<<"false";
}
    // for (int i = 0; i < )
    // }
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

不像现在的我,已经是虚伪的社会人了。
真烦好烦真烦:好有个性的一段话,导师没有让你修改吗
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-14 20:34
门头沟学院 Java
窝补药贝八股:管他们,乱说,反正又不去,直接说680
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务