class Solution {
public:
bool dfs(int target, string s, int index, int sum) {
// 只有整个字符串都被分割,求和,和看结果是不是等于target
if(index == s.size()) {
return sum == target;
}
int num = 0;
// 在现在的子集中去依次加入余下的元素
// 1 2 9 6
// 1 2 96
// 1 296
// 1296
// 12 9 6
// 12 96
// 1296
// 129 6
// 1296
// 大概就是这个意思
for(int i = index; i < s.size(); i ++) {
num = num * 10 + (s[i] - '0');
if(num + sum > target) return false;
// 如果现在这个划分可以的话,就表示,i * i是一个惩罚数(只用获得一种拆分就可以了)
if(dfs(target, s, i + 1, sum + num)) {
return true;
}
}
return false;
}
int punishmentNumber(int n) {
int ans = 0;
for(int i = 1; i <= n; i ++) {
string temp = to_string(i * i);
if(dfs(i, temp, 0, 0)) {
ans += i * i;
}
}
return ans;
}
};