找不出这两份代码的区别

B3624 猫粮规划

Mirror_of_the_Sky @ 2024-05-30 13:39:18

rt。本蒟蒻第一份代码全WA,第二份代码就AC了,有哪位大佬能帮我看一下吗?

#include <bits/stdc++.h>
using namespace std;
int a[44],ans;
int f[44][330];
int main() {
    int n,l,r;
    cin>>n>>l>>r;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
    }
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=r; j++) {
            if(j<a[i]){
                f[i][j]=f[i-1][j];
            }
            if(j==a[i]) {
                f[i][j]=f[i-1][j]+1;
            } else {
                f[i][j]=f[i-1][j]+f[i-1][j-a[i]];
            }
        }
    }
    for(int j=l; j<=r; j++) {
            ans+=f[n][j];
    }

    cout<<ans;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[44],ans;
int f[44][330];
int main() {
    int n,l,r;
    cin>>n>>l>>r;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
    }
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=r; j++) {
            if(j<a[i]) {
                f[i][j]=f[i-1][j];
            } 
            else if(j>a[i]){//here
                f[i][j]=f[i-1][j]+f[i-1][j-a[i]];
            }
            else{
                f[i][j]=f[i-1][j]+1;
            }
        }
    }
    for(int j=l; j<=r; j++) {
        ans+=f[n][j];
    }
    cout<<ans;
    return 0;
}

by NitsugaoO @ 2024-05-30 13:45:42

第一段代码:

if(j<a[i]){
    f[i][j]=f[i-1][j];
}
/* else */ if(j==a[i]) { // 所以这里要加 else
    f[i][j]=f[i-1][j]+1;
} else { // 这里是不等于 也就是包含了 j<a[i] 的情况 那原本大于执行的语句在小于的时候也跑了 相当于小于的情况被大于覆盖了.
    f[i][j]=f[i-1][j]+f[i-1][j-a[i]];
}

|