腾讯编程按钮那道题,用动态规划不知道哪里出问题了,求指点

作者:不吐槽不舒服斯基啊
链接:https://www.nowcoder.com/discuss/40991?type=0&order=0&pos=12&page=1 来源:牛客网
#include <iostream>
using namespace std;
void find_equal(int num1,int num2,int n,int total1,int total2,int &min_num){
if(num1==total1&&num2==total2){
if(n<min_num)
min_num=n;
return;
}
if(num1>total1)
return;
n=n+1;
find_equal(num1*2,num2*2,n,total1,total2,min_num);
find_equal(num1+1,num2*2,n,total1,total2,min_num);
}
int main() {
int a,b,A,B;
while(cin >> a >> b>>A>>B){
int min_num=100000;
find_equal(a,b,0,A,B,min_num);
if(min_num!=100000)
cout<<min_num<<endl;
else
cout<<"-1"<<endl;
}
}
我是想着用迭代去找,但不知道为什么min_num总是没变化==#腾讯#
全部评论
ma+n=A,pb+q=B,当时打算求出其中的m,n,p,q,然后。。然后就没有然后……
点赞 回复 分享
发布于 2017-09-13 22:17
按钮题 要想尽量次数少,肯定多用乘法,假设用乘法的次数为N 假如乘法的操作序列m(1) m(2)....m(N) 加法操作序列为n(1),n(2),n(3).....n(N) 综合操作序列为m(1) , n(1) , m(2) , n(2) , .... ,m(N) ,  n(N) 2^[m(1)+m(2)+...+m(N)]a + 2^[m(2)+...+m(N)]*n(1) + 2^[m(3)+...+m(N)]*n(2) +... + 2^[m(N)]*n(N-1) + n(N) = A 我是尽量用乘法,先把最大的乘法次数N求出来得到2^N,然后然后p = N; 然后: 2^[m(2)+...+m(N)]*n(1) + 2^[m(3)+...+m(N)]*n(2) +... + 2^[m(N)]*n(N-1) + n(N) = A - 2^[m(1)+m(2)+...+m(N)]a = restA 然后求加法的次数,加法次数想尽量小,那么越早加越好,加入在第i次乘法后加K(0<=i<=N),使2^i的系数K尽量大,设factor = 2^[m(2)+...+m(N)] restA = A - 2^[m(1)+m(2)+...+m(N)]a; restB = B - 2^[m(1)+m(2)+...+m(N)]b; while(restA != 0){ while(factor > restA){     factor /= 2;  } p+=restA/factor; restA%=factor; restB%=factor; } 最后判断restB是否等于0,不等于0则p=-1 我怕两个不符合,用同样的方法对B求一遍得到另一个p2 如果两个p都是大于等于0,则求最小值 如果一个大于等于0,一个小于0,则取大于等于0的值, 否则取这两个p的最小值非负值 不知道对不对
点赞 回复 分享
发布于 2017-09-13 18:21
为啥我没有算法题?投的是算法啊……
点赞 回复 分享
发布于 2017-09-13 17:53
因为你第二个find_XXX写错了, 所以一直无法满足条件, 所以就不会改变. PS: ***这明明是深搜, 装成动归骗人啊!
点赞 回复 分享
发布于 2017-09-13 17:24
你这是爆搜吧,第二个dfs写错了应该是+1你写成*2
点赞 回复 分享
发布于 2017-09-13 17:22

相关推荐

零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-15 12:20
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务