class Solution {
public:bool dfs(int target, string s, int index, int sum) {// 只有整个字符串都被分割,求和,和看结果是不是等于targetif(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;}
};