求条

B3624 猫粮规划

__Function__ @ 2024-11-04 13:04:16

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, l, r;
int a[41];
int ans;
void dfs(int sum, int x) {
    if(x > n + 1) {
        return;
    } 
    if(sum <= r && sum >= l) {
        ans++;
        if(x == n + 1)
            return;
    }
    dfs(sum + a[x], x + 1);//选 
    dfs(sum, x + 1);//不选
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    dfs(0, 1);
    cout << ans;
    return 0;
}

玄关QAQ(调一下暴力)


by Fcersoka @ 2024-11-04 13:50:18

@Function 改好了

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, l, r;
int a[41];
int ans;
void dfs(int sum, int x) {
    if(sum > r) {
        return;
    }
    if(x == n + 1) {
        if (sum >= l)
            ans++;
        return ;
    }
    dfs(sum + a[x], x + 1);//选 
    dfs(sum, x + 1);//不选
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    dfs(0, 1);
    cout << ans;
    return 0;
}

你需要当每个数的选或不选的选择都完毕后,再进行统计答案,否则会多算。而且需要一个减枝:当 sum > r 时,显然后面再怎么取也不会满足条件,所以直接返回。


by HEPwP @ 2024-11-04 13:51:04

@Function 晚了10s qwq

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, l, r;
int a[41];
int ans;
void dfs(int sum, int x) {
    if(x >= n + 1) {
        if(sum <= r && sum >= l) 
            ans++;
        return;
    } 

    dfs(sum + a[x], x + 1);//选 
    dfs(sum, x + 1);//不选
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    dfs(0, 1);
    cout << ans;
    return 0;
}

by __Function__ @ 2024-11-04 13:51:12

@Fcersoka 一关thx


by HEPwP @ 2024-11-04 13:52:30

我这个没加剪枝,是50pts的


by __Function__ @ 2024-11-04 13:56:38

@HEPwP thx


|