社区讨论

P1077 请问这两个代码的运行结果为什么不一样?实在看不出来了!

P1077[NOIP 2012 普及组] 摆花参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2gv997
此快照首次捕获于
2023/10/23 13:38
2 年前
此快照最后确认于
2023/10/23 13:38
2 年前
查看原帖
代码一(不正确)
C
#include <iostream>
#include <cstring>
using namespace std;

int n, m;
int arr[105];
int dp[105][105] = {0};
int moda = 1000007;

int dfs(int a, int now);

int main(){
    memset(dp, -1, sizeof(dp));
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
    }
    int ret = dfs(1, 0);
    cout << ret;
}

int dfs(int a, int now){
    if(a == n + 1){
        if(now == m) return 1;
        else return 0;
    }
    if(dp[a][now] == -1){
        dp[a][now] = 0;
        for(int i = 0; i <= arr[a]; i++){
            dp[a][now] = (dfs(a + 1, now + i) + dp[a][now]) % moda;
        }
    }   
    return dp[a][now] % moda;
}
代码二(正确):
C
#include <iostream>
using namespace std;

int n, m;
int arr[105];
int dp[105][105] = {0};
int moda = 1000007;
// int res = 0;

int dfs(int a, int now);

int main(){
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
    }
    int ret = dfs(1, 0);
    cout << ret;
}

int dfs(int a, int now){
    if(now > m) return 0;
    if(now == m) return 1;
    if(a == n + 1) return 0; //这里已经包含上面的条件了
    if(dp[a][now] == 0){
        for(int i = 0; i <= arr[a]; i++){
            dp[a][now] = (dfs(a + 1, now + i) + dp[a][now]) % moda;
        }
    }
    return dp[a][now] % moda;
}
测试用例:
C
100 100
73 8 4 15 49 58 90 25 11 23 14 74 53 91 36 50 99 45 24 30 81 54 41 13 22 69 92 81 48 49 46 34 47 67 38 34 29 59 44 20 37 19 39 19 39 87 80 88 66 8 87 88 62 80 63 0 52 84 62 59 49 68 40 11 54 75 82 51 30 82 44 15 38 99 82 91 73 54 100 88 63 39 71 84 64 16 39 45 82 78 85 39 86 75 39 40 93 69 37 43

回复

2 条回复,欢迎继续交流。

正在加载回复...