Newtopython
诗岑
2020-02-14 20:25
采纳率: 82.8%
浏览 853

关于01背包代码的一些问题

1.main函数使用了堆栈的“41216”个字节: 超过了 /analyze:stacksize '16384'。 请考虑将某些数据移到堆中。这个应该怎么解决?
2.以下见代码:(报错信息在注释中)

#include<stdio.h>
int max(int a, int b) {
    if (a >= b)return a;
    else return b;
}
main() {
    int n, c;
    int w[100], v[100];
    int i, j;
    int m[100][100];//已有价值和剩余容量
    int put[100];//是否放置
    scanf_s("%d %d", &n, &c);
    for (i = 0;i < n;i++) {
        scanf_s("%d", &w[i]);
    }
    for (i = 0;i < n;i++) {
        scanf_s("%d", &v[i]);
    }
    for (i = 0;i < n;i++) {
        for (j = c;j >= 0;j--){
            if (w[i] <= j) {//如果装得下
                m[i][j]= max(m[i - 1][j - w[i]] + v[i], m[i - 1][j]);
            }
            else {
                m[i][j] = m[i - 1][j];
            }


        }
    }
    printf("%d\n", m[n - 1][c]);//可读大小为40000个字节,但可能读取了-400个字节
    for (i = 0;i < n;i++) {
        for (j = c;j >= 0;j--) {
            if (m[i][j] == m[i - 1][j])put[i] = 0;
            else put[i] = 1;
        }
    }
    for (i = 0;i < n;i++) {
        printf("%d", put[i]);
        printf(" ");
    }













}

又:报错行的c是否该改为0?因为如果按照j表示剩余容量的设定,应该输出剩余容量为0时的最大价值
请各位大佬指教

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • chenxizhan1995
    chenxizhan1995 2020-02-14 21:46
    已采纳

    在函数内部声明了的二维数组超过了你系统的限制,有两种方案,1)把数组w和m的声明放到函数外面(就是声明为全局变量),或者
    2)用malloc动态申请内存创建二维数组。

    点赞 1 评论
  • qq_28249373
    shifenglv 2020-02-14 23:42
        VS默认的栈空间大小是4M,重新设置,比如8M,16M都可以。不过,不主张这么做。还是设置全局变量或者动态分配内存比较好
    
    点赞 评论

相关推荐