京东笔试--神奇数

我来抛砖引玉一个,对每个数判断是否是神奇数,用01背包问题的思路解的。
没想到这么暴力都能AC
bool IsNum(int num){
	vector<int> arr;
	int all(0);
	while (num){
		all += num % 10;
		arr.push_back(num % 10);
		num = num / 10;
	}
	if (all % 2){
		return false;
	}
	int half = all / 2;
	vector<int> dp(half + 1);
	for (int i = 0; i < arr.size(); i++){
		int cap(half);
		while (cap >= arr[i]){
			dp[cap] = max(dp[cap - arr[i]] + arr[i], dp[cap]);
			cap--;
		}
	}
	return dp[half] == half;
}

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

#京东##C++工程师#
全部评论
第一道写出了吗
点赞 回复 分享
发布于 2017-09-08 21:03
我曹,原来可以这么暴力
点赞 回复 分享
发布于 2017-09-08 21:04
这居然能ac  我开始就放弃了这种方法,结果最后都没做出来,我以为这样肯定超时了
点赞 回复 分享
发布于 2017-09-08 21:04
神了,都是下意识地排除了爆破
点赞 回复 分享
发布于 2017-09-08 21:09
这都能过....简直了
点赞 回复 分享
发布于 2017-09-08 21:09
第二题写着写着忘记时间到了,自动交卷了
点赞 回复 分享
发布于 2017-09-08 21:10
我也是,刚开始是90%,后来不知道怎么又ac了。。。 这个貌似关心的不是最大值,只算出存在就可以了,所以我用的是深度优先搜索+回溯。。。
点赞 回复 分享
发布于 2017-09-08 21:27
楼主解释下你这个状态的定义和状态转移方程呗
点赞 回复 分享
发布于 2017-09-08 21:28
想法一样一样的,但是下意识的排除了这种做法,没想到啊没想到.
点赞 回复 分享
发布于 2017-09-08 21:31
牛逼。 都以为会超时,结果你却AC了。仔细一想这样做时间复杂度不超过O(nlgn)
点赞 回复 分享
发布于 2017-09-08 21:46
为什么你们背包写得这么骚,看不懂
点赞 回复 分享
发布于 2017-09-08 21:50
牛批
点赞 回复 分享
发布于 2017-09-08 22:02

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务