博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2229
阅读量:6904 次
发布时间:2019-06-27

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

很不错的一道题,这里提供两种方法:

方法1:递推;

易知当n为奇数时,f[n]=f[n-1] (n-1的所有方案前面添1,并且没有新的方案);

重点是n为偶数的时候,则拆分方案中,要么有偶数个1,要么有没1;

当有偶数个1时,就相当于在n-1(奇数)的方案中添一个1,(每个奇数分解方案一定有奇数个1);

当没1时,那么参加分解每个数都是偶数,所以方案数=f[n/2];

根据加法原理可知f[n]=f[n-1]+f[n/2];

 

方法2:这题也可以转化为完全背包来做:

因为只能用2^k来分解,且不考虑顺序:

容易想到就是k个物品,每个物品重量是2^k,来填一个容积为n的背包;

所以,k=[logn]; 时间复杂度为O(nlogn); (完全背包问题见背包九讲)

虽然没有上一种方法时间复杂度优,但是体现了就看似是数学问题向背包问题转化的思路,(参见noip2012pj第三题)

1 const ff=1000000000; 2 var f:array[0..1000100] of int64; 3     d:array[0..50] of longint; 4     i,j,n,k:longint; 5 begin 6   readln(n); 7   k:=trunc(ln(n)/ln(2)); 8   d[0]:=1; 9   for i:=1 to k do10     d[i]:=d[i-1]*2;11   f[0]:=1;12   for i:=0 to k do13   begin14     for j:=d[i] to n do15     begin16       f[j]:=(f[j-d[i]]+f[j]);17       if f[j]>ff then f[j]:=f[j]-ff;18     end;19   end;20   writeln(f[n] mod ff);21 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4473308.html

你可能感兴趣的文章
MYSQL(python)安装记录
查看>>
(十一)构造方法的重载和成员方法的重载
查看>>
The Use Of Class Pointer
查看>>
《CLR Via C# 第3版》笔记之(二十三) - 线程锁和线程安全的概念
查看>>
Meta标签详解
查看>>
Kaggle : Display Advertising Challenge( ctr 预估 )
查看>>
jquery stop( ) 的用法 (转)
查看>>
【js】性能问题
查看>>
JS引擎线程的执行过程的三个阶段(一)
查看>>
Spark RDD Transformation 简单用例(三)
查看>>
ES6(1)
查看>>
成为Java GC专家(5)—Java性能调优原则
查看>>
作业——05 理解爬虫原理
查看>>
泛型算法的一些总结
查看>>
python 列表操作
查看>>
ServletContext和ServletConfig
查看>>
moveit setup assistant
查看>>
10种常见的软件架构模式
查看>>
SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
查看>>
solrr初步了解 ...
查看>>