京东神奇数为嘛你们暴力过了,我暴力就过不了呢?

#include <iostream>
#include <vector>
using namespace std;
typedef uint32_t uint;
bool isMiracle(uint num) {
    vector<int> arr1;

    uint sum  = 0;
    while(num) {
        sum += (num % 10);
        arr1.push_back(num%10);
        num /= 10;
    }

    if(sum & 1) return false;

    sum = sum >> 1;

    vector<bool> dp(sum+1, 0);
    dp[0] = true;
    for(auto n : arr1)
        for(int i = sum; i>=n; i--)
            dp[i] = dp[i-n];
	return dp[sum];
}

int main() {
    int l, r;
    while(cin >> l >> r) {
        int res = 0;
        for(int i = l; i <= r; i++) {
            if(isMiracle(i)) res++;
        }
        cout << res << endl;
    }
    return 0;
}

求帮忙查看一下为什么?

全部评论
vector<bool>的受害者
点赞 回复 分享
发布于 2017-09-08 21:07
我想法和你应该差不多,但是我是把那个得到的数组排序再搜索剪枝,过了
点赞 回复 分享
发布于 2017-09-08 21:09
#include <iostream> #include <vector> using namespace std; typedef uint32_t uint; bool isMiracle(uint num) { vector<int> arr1; uint sum = 0; while(num) { sum += (num % 10); arr1.push_back(num%10); num /= 10; } if(sum & 1) return false; sum = sum >> 1; vector<bool> dp(sum+1, 0); dp[0] = true; for(auto n : arr1) if(dp[sum]) return true;//提前结束 for(int i = sum; i>=n; i--){ //这一行之前的逻辑有问题 if(dp[i-n]) dp[i] = true; } return dp[sum]; } int main() { int l, r; while(cin >> l >> r) { int res = 0; for(int i = l; i <= r; i++) { if(isMiracle(i)) res++; } cout << res << endl; } return 0; } 之前写法有问题,现在修改了一些问题; 另外加上剪枝,可以提前结束; 难得自己思路是对的,难得代码也写出来,结果出现这种毛病;上次拼多多犯过类似的错误,这次又特么犯了一次,好尴尬!!
点赞 回复 分享
发布于 2017-09-08 21:20
总是潜意识的排除暴力。唉
点赞 回复 分享
发布于 2017-09-08 21:54
dp[i] = dp[i-n]; 应该是 dp[i] = dp[i-n] || dp[i]; 可以选择有或没有那个数
点赞 回复 分享
发布于 2017-09-09 00:03

相关推荐

数学转码崽:果然实习还是看质量不看数量
点赞 评论 收藏
分享
02-12 17:30
已编辑
字节跳动_实习生(实习员工)
要怎么办呢牛:我觉得大厂日常实习最大的意义就是给自己背书,一个好公司的实习就像一个好学历似的,能够给自己增加一个标签,让别人觉得你可以。(至于真正实习干了啥,这个感觉并不太重要)。当然一家之言,仅供参考。另外,楼主已经很强了,实习毕业双双拿下,已经领先好多好多人了,羡慕啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务