範測的最後一組 201612 28 ,我的程式一直輸出0,不知道這樣遞迴哪裡錯了QQ,想請教大大們!
#include<stdio.h>
#include<unordered_map>
using namespace std;
long long n,m;
unordered_map<long long,long long> map;//用哈希表把答案記錄下來
long long f(long long num){
if(map.count(num))
return map[num];
if(num==m)
return map[num]=1;
if(num<m)
return map[num]=0;
if(num&1)
return map[num]=f((num+1)>>1)+f((num-1)>>1);
else
return map[num]=(f(num>>1)<<1);
}
int main(){
while(~scanf("%lld%lld",&n,&m)) {
printf("%lld\n",f(n));
map.clear();
}
}
範測的最後一組 201612 28 ,我的程式一直輸出0,不知道這樣遞迴哪裡錯了QQ,想請教大大們!
#include
#include
using namespace std;
long long n,m;
unordered_map map;//用哈希表把答案記錄下來
long long f(long long num){
if(map.count(num))
return map[num];
if(num==m)
return map[num]=1;
if(num<m)
return map[num]=0;
if(num&1)
return map[num]=f((num+1)>>1)+f((num-1)>>1);
else
return map[num]=(f(num>>1)<<1);
}
int main(){
while(~scanf("%lld%lld",&n,&m)) {
printf("%lld\n",f(n));
map.clear();
}
}
給一個簡單的測資如下:
4 3
您的程式碼會給出 0 這個答案,但是應為 1 才對。
因為 n = 4 時,您的程式會將其分為兩個 2 並遞迴去求 n = 2 的狀況。
此時因為條件式 num < m ,所以會回傳一個 0 到上一層的遞迴堆疊。而 0 × 2 = 0 ,所以最終的回傳值為 0 。
而這當然是不正確的,因為如果 m ≦ num < 2 × m 即可知道這個數量的橘子片最多只能分給一個人,不用繼續剖開去求解。
因此,遞迴式之終止條件須作一些調整。
以上,希望有幫助到您。
範測的最後一組 201612 28 ,我的程式一直輸出0,不知道這樣遞迴哪裡錯了QQ,想請教大大們!
#include
#include
using namespace std;
long long n,m;
unordered_map map;//用哈希表把答案記錄下來
long long f(long long num){
if(map.count(num))
return map[num];
if(num==m) return map[num]=1;
if(num<m)
return map[num]=0;
if(num&1)
return map[num]=f((num+1)>>1)+f((num-1)>>1);
else
return map[num]=(f(num>>1)<<1);
}
int main(){
while(~scanf("%lld%lld",&n,&m)) {
printf("%lld\n",f(n));
map.clear();
}
}
給一個簡單的測資如下:
4 3
您的程式碼會給出 0 這個答案,但是應為 1 才對。
因為 n = 4 時,您的程式會將其分為兩個 2 並遞迴去求 n = 2 的狀況。
此時因為條件式 num < m ,所以會回傳一個 0 到上一層的遞迴堆疊。而 0 × 2 = 0 ,所以最終的回傳值為 0 。
而這當然是不正確的,因為如果 m ≦ num < 2 × m 即可知道這個數量的橘子片最多只能分給一個人,不用繼續剖開去求解。
因此,遞迴式之終止條件須作一些調整。
以上,希望有幫助到您。
謝謝您!!原來是我誤解題意了><,一直以為題目要求的是剛好分成m片,再次感謝!!