首页 > 试题广场 >

两只队伍分物资

[编程题]两只队伍分物资
  • 热度指数:288 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
这里有一堆物资待分配,物资总数量不超过200(),每件物资重量不超过100()。
请问是否可以将这堆物资分配给两个队伍,使得两个队伍的全部的物资重量和相等。
示例1

输入

[1, 5, 11, 5]

输出

true

说明

数组可以分为 [1, 5, 5] 和 [11]
示例2

输入

[1, 2, 3, 5]

输出

false
其实就是0-1背包问题
class Solution:
    def canPartition(self , nums):
        # write code here
        if nums == []:
            return True
        if sum(nums) % 2 == 1:
            return False
        target = int(sum(nums) / 2)
        dp = [True] + [False] * target
        for i, num in enumerate(nums):
            for j in range(target, num - 1, -1):
                dp[j] |= dp[j - num]
        return dp[target]


发表于 2021-01-15 11:05:02 回复(1)
class Solution:
    def canPartition(self , nums):
        # write code here
        if nums == []:
            return True
        if sum(nums) % 2 == 1:
            return False
        target = int(sum(nums) / 2)
        dp = [True] + [False] * target
        for i, num in enumerate(nums):
            for j in range(target, num - 1, -1):
                dp[j] |= dp[j - num]
        return dp[target]
发表于 2021-01-15 16:10:47 回复(0)
就是一个0-1背包的变形,我们首先考虑能不能对半分,不能直接返回,如果能,那么我们就类似的把背包的空间看成sum/2,每一个物品的重量既是重量也是需要的空间,我们最后只需要看能不能装满sum/2即可。
class Solution {
public:
    /**
     * 
     * @param nums int整型一维数组 
     * @param numsLen int nums数组长度
     * @return bool布尔型
     */
  
    int dp[10000000];
    bool canPartition(int* nums, int numsLen) {
       int sum=0;
        for(int i=0;i<numsLen;i++)
            sum+=nums[i];
        if(sum%2!=0)
            return false;
        else
        {
            sum/=2;
            for(int i=0;i<numsLen;i++)
                for(int j=sum;j>=nums[i];j--)
                {
                    //if(j-nums[i]>=0)
                    dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
                }
            if(sum==dp[sum])
                return true;
            else
                return false;
        }
        //return true;
    }
};


发表于 2021-03-12 21:59:23 回复(0)
# 回溯法问题
class Solution:
    def canPartition(self , nums):
        # write code here
        if not nums:
            return True
        sums = sum(nums)
        if sums % 2 != 0:
            return False
        if max(nums) > sums:
            return False
        average = sums/2
        count = 0
        total = 0
        vis = set()
        def dfs(count,total):
            if total == average:
                total = 0
                count += 1
            if count == 2 and total == 0 and len(vis) == len(nums):
                return True
            for i in range(len(nums)):
                if i and nums[i] == nums[i-1] and i-1 not in vis:
                    continue
                if nums[i]+total<=average and i not in vis:
                    vis.add(i)
                    if dfs(count,total+nums[i]):
                        return True
                    vis.remove(i)
            return False
        return dfs(count,total)
        
发表于 2021-07-21 20:54:50 回复(0)
class Solution {
public:
    /**
     * 
     * @param nums int整型一维数组 
     * @param numsLen int nums数组长度
     * @return bool布尔型
     */
    int sum(int* nums,int numsLen){
        int sum_=0;
        for(int i=0;i<numsLen;i++){
            sum_+=nums[i];
        }
        return sum_;
    }

    /**
     * 
     * @param nums int整型一维数组 
     * @param numsLen int nums数组长度
     * @return bool布尔型
     */
    bool canPartition(int* nums, int numsLen ) {
        // write code here
        int sums=sum(nums,numsLen);
        //printf("%d   %d",sums,numsLen);
        if(numsLen<2) return 0;
        if(sums%2==1) return 0;
        int target=sums/2;
        bool dp[target+1];
        dp[0]=true;
        for(int i=1;i<target+1;i++){
            dp[i]=false;
        }
        for(int i=0;i<numsLen && !dp[target];i++){
            if(nums[i]<=target){
                for(int j=target;j>=0;j--){
                    if(dp[j]&&j+nums[i]<=target){
                        dp[j+nums[i]]=1;
                    }
                }
            }
        }
        return dp[target];
    }
};

发表于 2021-02-06 23:26:23 回复(0)