题目链接
对于这题来说,你只要列出几个数就可以发现规律
对于一个数来讲
如果是一个奇数,那么他的1的个数就是前一个偶数的1的个数+1
如果是一个偶数,那么他的1的个数就是n/2的1的个数
则有转移方程
if(i%2==0){
dp[i]=dp[i/2];
}else{
dp[i]=dp[i-1]+1;
}
public int[] countBits(int num) {
int[] dp=new int[num+1];
dp[0]=0;
if(num==0){
return dp;
}
dp[0]=0;
for(int i=1;i<=num;i++){
if(i%2==0){
dp[i]=dp[i/2];
}else{
dp[i]=dp[i-1]+1;
}
}
return dp;
}