| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1163 人关注过本帖, 1 人收藏
标题:关于一个问题的求助,想了半晚上想不明白
只看楼主 加入收藏
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
不同组合是34种
2010-09-17 19:35
a351357741
Rank: 2
等 级:论坛游民
帖 子:117
专家分:70
注 册:2010-9-15
收藏
得分:0 
转载自:YxMadOSの部屋的博客
【分析】

说实在的,这是我在省选题目里见到的最水的题没有之一!

我们知道,连续2的i次幂可以组成任何不大于2^(i+1)的正整数。。于是这个题就出来了。。

把所有的m分成两种情况:

一开始不断用2的次幂相加,直到相加后不超过m的最大值。设k为m-2^i

1>剩余的k不为2的次幂,那么直接把k作为单独的一组即可。

证明:我们需要构成[1,m]的所有价格,当需要构成的价格price<=m-k的时候,用之前的2的次幂金钱数的钱袋就可以完成;需要构成价格price>m-k时,可以转化为求构成price-k价格的可行解,因为price-k<m-k,又可以转化为前一种price<m-k的情况,证毕。

2>剩余的k恰好是2的次幂,那么需要把k+1作为一组,将上一个2的次幂-1构成一组。

证明:当需要构成的价格price<=m-k-1的时候,可以很明显地看出m-k-1是属于1>的情况,按1>的方案可解决;当需要构成的价格price>m-k-1的时候,可以转化为求构成price-k-1价格的可行解,因为price-k-1<=m-k-1,又转化为了前一种情况,证毕。


2010-09-17 19:36
a351357741
Rank: 2
等 级:论坛游民
帖 子:117
专家分:70
注 册:2010-9-15
收藏
得分:0 
程序代码:
#include"stdio.h"
int main()
{

 long m,s[100000],t=0;

 scanf("%ld",&m);

 while(m>0)

 {
  if(m%2==0)
   s[t++]=m/2;
  else
   s[t++]=m/2+1;
  m-=s[t-1];

 }

 printf("%ld\n",t);

 for(int i=t-1;i>=0;i--)
  printf("%ld ",s[i]);
  getchar();
  getchar();
}
2010-09-17 19:40
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
可支付任意数的钱所装的金币满足数列1 2 4 7 12 20 从第三项等于前两项之和加1,
int f(int n)
{
    if(n>2)
       return f(n-1)+f(n-2)+1;
    else return n
}
2010-09-17 19:46
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
以下是引用a351357741在2010-9-17 19:40:24的发言:

#include"stdio.h"
int main()
{
 long m,s[100000],t=0;
 scanf("%ld",&m);
 while(m>0)
 {
  if(m%2==0)
   s[t++]=m/2;
  else
   s[t++]=m/2+1;
  m-=s[t-1];
 }
 printf("%ld\n",t);
 for(int i=t-1;i>=0;i--)
  printf("%ld ",s);
  getchar();
  getchar();
}
我晕!不合题意吧
2010-09-17 19:55
a351357741
Rank: 2
等 级:论坛游民
帖 子:117
专家分:70
注 册:2010-9-15
收藏
得分:0 
回复 16楼 真我
差不多 呵呵!
2010-09-17 19:57
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
以下是引用真我在2010-9-17 19:46:58的发言:

可支付任意数的钱所装的金币满足数列1 2 4 7 12 20 从第三项等于前两项之和加1,
int f(int n)
{
    if(n>2)
       return f(n-1)+f(n-2)+1;
    else return n
}
带的金币总数M=数列的和,n就所带的钱袋数
2010-09-17 19:58
a351357741
Rank: 2
等 级:论坛游民
帖 子:117
专家分:70
注 册:2010-9-15
收藏
得分:0 
[问题描述] 设有已知面额的邮票m种,每种有n张。用总数不超过n张的邮票进行组合,能组合的邮票面额中可以连续出现面额数最多有多少?(1<=m<=100,1<=n<=100,1<=邮票面额<=255) 输第一行:n和m的值,中入:间用一空格隔开。第二行:a[1..m](面额) ,每个数中间用一空格隔开。输出:连续面额数的最大值
2010-09-17 20:12
a351357741
Rank: 2
等 级:论坛游民
帖 子:117
专家分:70
注 册:2010-9-15
收藏
得分:0 
题解自己看吧是pascal的
http://hi.baidu.com/lzh070707/blog/item/c4eff1c67ff0eda38326acdd
也可以搜 NOIP1999 邮票面值设计
2010-09-17 20:13
快速回复:关于一个问题的求助,想了半晚上想不明白
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.065234 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved