原题题目
代码实现(迷惑首刷大部分看解小部分自解)
bool calc(int choose,int maxChoosableInteger,int sparetotsl,char* dp)
{
if(dp[choose]) return dp[choose] == 1;
dp[choose] = 2;
int i;
for(i=1;i<=maxChoosableInteger;i++)
{
int t = 1<<(i-1);
int c = choose;
if((t & c) == 0)
{
c |= t;
if(sparetotsl <= i || !calc(c,maxChoosableInteger,sparetotsl-i,dp))
{
dp[choose] = 1;
break;
}
}
}
return dp[choose] == 1;
}
bool canIWin(int maxChoosableInteger, int desiredTotal){
int sum = (1+maxChoosableInteger) * maxChoosableInteger /2;
if(sum < desiredTotal) return false;
int t = 1<<maxChoosableInteger;
int choose = 0;
char* dp = (char*)malloc(sizeof(char) * (t));
memset(dp,0,sizeof(char) * t);
return calc(choose,maxChoosableInteger,desiredTotal,dp);
}
代码实现(首刷大部分看解 数组型)
bool calc(int choose,int maxChoosableInteger,int sparetotsl,int* dp)
{
if(dp[choose]) return dp[choose] == 1;
dp[choose] = 2;
int i;
for(i=1;i<=maxChoosableInteger;i++)
{
int t = 1<<(i-1);
int c = choose;
if((t & c) == 0)
{
c |= t;
if(sparetotsl <= i || !calc(c,maxChoosableInteger,sparetotsl-i,dp))
{
dp[choose] = 1;
break;
}
}
}
return dp[choose] == 1;
}
bool canIWin(int maxChoosableInteger, int desiredTotal){
int sum = (1+maxChoosableInteger) * maxChoosableInteger /2;
if(sum < desiredTotal) return false;
int t = 1<<maxChoosableInteger;
int choose = 0;
int* dp = (int*)malloc(sizeof(int) * (t));
memset(dp,0,sizeof(int) * t);
return calc(choose,maxChoosableInteger,desiredTotal,dp);
}