dfs,40pts求剪枝
查看原帖
dfs,40pts求剪枝
1074084
asd890123楼主2024/6/8 10:30

背包死活学不会,背也背不出,想着用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;
}
2024/6/8 10:30
加载中...