这道算法题怎么做?

yjcq 2006-05-22 10:24:08
输入二个整数C,M。(C>1)(M可以很大,小于10^1000)
问M能否用C的幂集(C^0, C^1, C^2, ..., C^i )中的元素相加得到,如能得到,返回需要的C的幂集中的元素的个数,如不能,返回-1

如输入2 63 得到6
如输入10 11111111111111111111 得到20





...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjcq 2006-05-23
  • 打赏
  • 举报
回复
应该用贪心算法, 先用一个最大的可能幂去减W,
如何找到一个最大的可能幂呢?W可能很大,要用到大整数的乘法吗?
femalelover 2006-05-22
  • 打赏
  • 举报
回复
我晕,还设什么开关,分治法这里不适用,差点误导人了.

应该用贪心算法, 先用一个最大的可能幂去减W,这个幂就是当前最优,再求次大的幂...;这算是一轮,一轮下来,可能匹配失败, 失败的话,再用次大幂作当前最优解,求....找到为止,最后必须有重复时,则求解失败.

去网上搜答案,应该不难,时间复杂度是O(N^2).
jiayu7_7 2006-05-22
  • 打赏
  • 举报
回复
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
int c;
bool flag=true;
long double m,k(0);
cin>>c>>m;
while(flag)
{
if(m<pow(c,k)&&int(m)!=0)
{
cout<<"no"<<endl;
break;
}
else if(m<pow(c,k))
{
cout<<k<<endl;
break;
}
m=m-pow(c,k);
k++;
}
}
试试行不????
femalelover 2006-05-22
  • 打赏
  • 举报
回复
由于你的W值多大未定义,所以可以设置一个开关,当W不大于某个数时,如10^4,就用穷举法,递归求解; 大于开关时,用分治法,效率肯定很高.
femalelover 2006-05-22
  • 打赏
  • 举报
回复
楼主的提法可能有点问题,如果允许C的幂重复出现,则C^0=1,故总是可返回一个答案.
如果不允许重复.....我想想.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧