2018-08-26 LeetCode分割等和子集

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

class Solution {
    public boolean canPartition(int[] nums) {
        if(nums.length == 0) return false;
        int sum = 0;
        for(int i:nums){
            sum += i;
        }
        if(sum % 2 == 1)return false;//集合总和为奇数
        boolean[] dp = new boolean[sum+1];
        dp[0] = true;   
        for (int j = 0; j < nums.length; j++) {
                for (int k = sum; k >= 0 && k >= nums[j]; k--) {
                        dp[k] =  dp[k] || dp[k-nums[j]];
                }
                if(dp[sum / 2]) {//存在某个子集的和sum / 2
                    return true;
                }
            }
        return false;
    }
}

京东2018校招求神奇数
东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和等于另一组数字的和,我们就将这个数称为神奇数。例如242就是一个神奇数,我们能够将这个数的数字分成两组,分别是{2,2}以及{4},而且这两组数的和都是4。东东现在需要统计给定区间中有多少个神奇数,即给定区间[l, r],统计这个区间中有多少个神奇数,请你来帮助他

public class jd {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int start = sc.nextInt();
        int end =sc.nextInt();
        System.out.println(findMagicNumber(start, end));
        sc.close();
        
    }
    static public int findMagicNumber(int start, int end) {
        int ans = 0;
        int[] digitals = new int[10];
        boolean[] dp = new boolean[9 * 9];
        Arrays.fill(digitals, -1);
        Arrays.fill(dp, false);
        dp[0] = true;
        for (int i = start; i <= end; i++) {
            int num = i;
            int sum = 0;
            int index = 0;
            while (num > 0) {
                int temp = num % 10;
                digitals[index++] = temp;
                sum += temp;
                num = num / 10;
            }
            // 当各位数字和为偶数时,才存在神奇数
            if ((sum & 1) == 0){
                for (int j = 0; j < digitals.length && digitals[j] != -1; j++) {
                    for (int k = sum; k >= 0; k--) {
                        // 用一维数组进行更新
                        if(k >= digitals[j]) {
                            dp[k] = dp[k] || dp[k-digitals[j]];
                            System.out.println(k+" "+digitals[j]+" "+dp[k]);
                        }
                            
                    }
                    if(dp[sum / 2]) {
                        ans++;
                        System.out.println(i);
                        break;
                    }
                }
            }
            Arrays.fill(digitals, -1);
            Arrays.fill(dp, false);
            dp[0] = true;
        }
        return ans;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 谢谢牛客网帮助我成功拿到心仪的offer(自然语言算法工程师),也感觉各位大佬分享的面经,所以想回馈一波。...
    batbattle阅读 3,712评论 0 3
  • ❤第16篇文章 前天,在qq空间看到学长发布的某医院招聘信息,是一家省级专科三甲医院,正式员工待遇不差。还没仔细看...
    学灰小女神阅读 294评论 0 0
  • 任何一个人,哪怕0基础,按照这九个步骤套用,也可以很快写出一篇勾引的软文出来 第一步 标题 1、让人好奇 2、像个...
    东哥讲销售1阅读 391评论 0 6
  • 每一次,离开家,母亲千叮万嘱,絮絮叨叨没完没了地交待,路上不与陌生人说话,不吃陌生人的食物,看管好背包,及背包里装...
    玉妮阅读 236评论 0 0