背包死活学不会,背也背不出,想着用dfs水一下,结果只AC了1,2,3,4,剩下全T,请问有办法通过剪枝AC,或者过更多的点么?
#include <iostream>
#include <climits>
int f[1005],s,ans = INT_MIN;
int F(int x){
int ans = 0;
for (int i = 1;i < x;i++)
if (x % i == 0)
ans += i;
return ans;
}
void dfs(int x,int sum,int worth){
if (sum > s) return;
ans = std::max(ans,worth);
if (x > s) return;
dfs(x + 1,sum,worth);
dfs(x + 1,sum + x,worth + f[x]);
}//正在考虑是否选择数字x,已选择的数字和为sum,约数和为worth
int main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0),std::cout.tie(0);
std::cin >> s;
for (int i = 1;i <= s;i++) f[i] = F(i);
dfs(1,0,0);
std::cout << ans << '\n';
return 0;
}