火眼金睛之帮忙找不同

以下代码有几处不同之处,使他们的结果天差地别,你能帮忙找出来吗?
题目是小柴买东东
#include<bits/stdc++.h>
using namespace std;
long long n=0,x=0,a[77];
map<long long ,map<long long,long long> > mp ;
int dfs(long long node,long long pos){
if(pos==1){
return node;
}
if(mp[node][pos]!=0){
return mp[node][pos];
}
int ans1=node/a[pos]+dfs(node%a[pos],pos-1);
int ans2=node/a[pos]+1+dfs((node/a[pos]+1)*a[pos]-node,pos-1);
//cout<<ans1<<" "<<ans2<<endl;
return mp[node][pos]=min(ans1,ans2);
}
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cout<<dfs(x,n);
return 0;
}

#include <bits/stdc++.h>
using namespace std;
long long a[77],n,x,ans1=0,ans2=0;
map<long long ,map<long long,long long> > mp ;
int dfs(long long node,long long k){
if(k==1){
return node;
}
if(mp[node][k]!=0){
return mp[node][k];
}
ans1=node/a[k]+dfs(node%a[k],k-1);
ans2=node/a[k]+1+dfs((node/a[k]+1)*a[k]-node,k-1);
cout<<ans1<<" “<<ans2<<” “<<node<<” "<<k<<endl;
mp[node][k]=min(ans1,ans2);
return min(ans1,ans2);
}
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cout<<dfs(x,n);
return 0;
}
其实我也不知道不同在哪

5 个赞

这区别大了

5 个赞

第一个有双斜杠

4 个赞

题目详情是
虽然现在已经数字时代了,但现金却依旧还是非常有必要的。就像是小柴不会用手机,所以他买东西都是带着现金去的。他平时买东西总是喜欢花的越少越好。一天他突发奇想,现金是一张一张的,打算挑战一下用现金的越少张越好,但他的好朋友小花花认为这算不上什么本事,用现金买东西,可能会有找零的问题,她觉得小柴可以挑战一下用现金的张数+老板找零的张数总和最少(老板很好心,会帮助小柴)。小柴才不会认输,但他感觉这样确实有点难度,希望神犇的你能够帮帮他。

输入格式:

第一行输入两个整数 N,X,分别代表有 N 种面值的钞票,这件商品需要 X 元钱。(1 ≤ N ≤ 60,1≤ X ≤ 1018)

第二行有 N 个整数 Ai。

保证 A1 是 1 ,A1 < … < AN ≤ 1018

同时保证对于所有的 1≤ i ≤ N−1,Ai+1 都是 Ai 的倍数

输出格式:

对于每组测试数据,输出一个整数表示答案。

4 个赞

我看不懂
OK??

4 个赞

哪里不懂?

4 个赞

啥都不懂

4 个赞

I think so!

4 个赞

这两段代码的主要区别在于第二段代码中的 dfs 函数内多了一行输出语句 cout<<ans1<<" “<<ans2<<” “<<node<<” "<<k<<endl; ,而第一段代码中没有这行语句。这行语句会在每次调用 dfs 函数时输出 ans1ans2nodek 的值。

3 个赞

抱歉,我大意了,请忽略 cout<<ans1<<" “<<ans2<<” “<<node<<” "<<k<<endl; 本来我是用来调试的,忘记删除了,又及上面的pos与下面的k等价。
即使更正这些两者对相同数据的输出仍不相同

2 个赞