博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2229 Sumsets(技巧题, 背包变形)
阅读量:7060 次
发布时间:2019-06-28

本文共 684 字,大约阅读时间需要 2 分钟。

discuss 看到有人讲完全背包可以过, 假如我自己做的话, 也只能想到完全背包了

 

思路:

1. 当 n 为奇数时, f[n] = f[n-1], 因为只需在所有的序列前添加一个 1 即可, 所有的序列同时延迟 1 位, 不会出现重复

  若是这个 1 和其他的1组成 2 而不是放在首位, 怎么办? 不会这样, 因为这个序列肯定已经存在了

  证明, 假设sum(s1) = 2*k, s1内部某个1加1得到 s2, 则 sum(s2) = 2*k+1, s2 的首位仍然肯定是1, 那么 s2 也可以通过 s3 延长而来, 所以必然已经存在了

  

2. 当 n 为偶数时, 分为两种情况

  <1> 某个序列首位为1, 则该序列由 f(n-1) 延长而来

  <2> 当某个序列首位为2, 则该序列没有1, 将该序列的所有元素除以 2, 则 是 f(n/2)的序列

      f[n] = f[n-1]+f[n/2]

代码:

#include 
using namespace std;int dp[1000001];int main() { int N; cin >> N; dp[1] = 1; for(int i = 2; i <= N; i ++) { if(i&1 == 1) { // odd dp[i] = dp[i-1]; }else{ //even dp[i] = (dp[i-1]+dp[i>>1])%1000000000; } } cout << dp[N] << endl; return 0;}

  

转载地址:http://bcyll.baihongyu.com/

你可能感兴趣的文章
深入探索 Kdump
查看>>
three.js 坐标系、camera位置属性、点、线、面
查看>>
kubernetes1.9安装dashboard,以及token认证问题
查看>>
linux tcpdump
查看>>
优秀的GPS定位系统源码对开发者意味着什么
查看>>
ASP.NET (Web) + C#算法 | 生成随机数字序列(随机数字+每个数字取随机不重复的位置和颜色)...
查看>>
理解神经网络:从神经元到RNN、CNN、深度学习
查看>>
我国第一部太赫兹视频合成孔径雷达成功研制
查看>>
外卖新零售品牌佐大狮完成数千万元天使轮融资,高榕资本领投
查看>>
GrooveX研发情感治愈机器人lovot,可与人类完成亲密互动
查看>>
使用kubeadm安装k8s-1.11版本
查看>>
Nginx + Keepalived
查看>>
【翻译】Prometheus 2.0.0 新特性
查看>>
Unity 动态加载Animator Event 事件
查看>>
美联邦调查局 FBI 网站被黑,数千特工信息泄露
查看>>
超燃!Apache Flink 全球顶级盛会强势来袭
查看>>
约你一起来写作
查看>>
微服务框架 Jboot 2.0.5 发布,常规更新
查看>>
Jersey 2.x 运行项目
查看>>
Java 之 Comparable vs Comparator
查看>>