诗岑 2020-02-14 20:25 采纳率: 93%
浏览 1246
已采纳

关于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 2020-02-14 21:46
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)