入坑新手求帮助 2023-04-08 09:35 采纳率: 100%
浏览 104
已结题

C语言0-1背包问题

为什么代码编译的时候没有报错但运行的时候只能运行一半

#include <stdio.h>
#define mn 50
int min(int a,int b)
{
    int min;
    if(a<b) min=a;
    return min;
}
int max(int a,int b)
{
    int max;
    if(a>b) max=a;
    return 0;
}
void Knapsack(int *v, int *w, int c, int n, int (*m)[mn])
//v[]物品的价值,w[]物品的重量,c背包容量,n物品数量,m[i][j]是背包容量为j,可选择物品为i,i+1....n的最优值
{
    int j,i;
//先判断第n个物品能不能装入背包
  int jMax = min(w[n]-1,c);
//当0<=j<=w[n]时,m(n,j)=0
  for(j=0; j<=jMax;j++)  m[n][j]=0;
//当j>=w[n]时,m(n,j)=v[n]
  for(j=w[n]; j<=c; j++)  m[n][j] = v[n];
//再从n-1往前开始判断第n个物品到第i个物品能不能装下
  for(i=n-1; i>1; i--)
  {    jMax = min(w[i]-1,c);
    for(j=0; j<=jMax; j++)//背包剩余容量j<=jMax<c
        m[i][j] = m[i+1][j];//无法装入第i个物品
    for(j=w[i]; j<=c; j++)
        m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
  }
  //判断第n个到第1个物品能不能装下
  m[1][c] = m[2][c];
  if(c>=w[1])
    m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
  }
//x[]数组: 值为0表示不装入背包,值为1表示装入背包
void Traceback(int (*m)[mn], int *w, int c, int n, int *x)
{
    int i;
    for(i=1; i<n; i++)
    {
        if(m[i][c] == m[i+1][c])
            x[i]=0;
        else
        {
            x[i]=1;
            c-=w[i];
        }
    }
    x[n]=(m[n][c])?1:0;
}
int main()
{
    int n,c,i;
    printf("请输入物品的数量n=");
    scanf("%d",&n);
    printf("请输入背包的容量c=");
    scanf("%d",&c);
    int w[100];
    printf("请依次输入各物品的重量:");
    for(i=1;i<=n;i++)
        scanf("%d",w[i]);
    int v[100];
    printf("请依次输入各物品的价值:");
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    int m[mn][mn];
    int x[100];
    int mw=0;
    int mv=0;
    //进行查找与回溯
    Knapsack(v,w,c,n,m);
    Traceback(m,w,c,n,x);
    //输出最优序列和最优重量与最优值
    printf("最优装载序列为:\n");
    for(i=1;i<=n;i++)
    {
        printf("&d",x[i]);
        mw=mw+x[i]*w[i];
        mv=mv+x[i]*v[i];
    }
    printf("最大重量为:%d\n最大价值为:%d\n",mw,mv);
    return 0;
}

运行结果

img

  • 写回答

6条回答 默认 最新

  • 语言-逆行者 2023-04-08 11:17
    关注

    基于new Bing的回答:
    在代码中,有一个max函数的返回值是0,应该改为返回max。修改后的代码如下:

    #include <stdio.h>
    #define mn 50
    int min(int a,int b)
    {
    int min;
    if(a<b) min=a;
    return min;
    }
    int max(int a,int b)
    {
    int max;
    if(a>b) max=a;
    else max=b; //修改这里,返回max值
    return max;
    }
    void Knapsack(int *v, int *w, int c, int n, int (*m)[mn])
    //v[]物品的价值,w[]物品的重量,c背包容量,n物品数量,m[i][j]是背包容量为j,可选择物品为i,i+1....n的最优值
    {
    int j,i;
    //先判断第n个物品能不能装入背包
    int jMax = min(w[n]-1,c);
    //当0<=j<=w[n]时,m(n,j)=0
    for(j=0; j<=jMax;j++) m[n][j]=0;
    //当j>=w[n]时,m(n,j)=v[n]
    for(j=w[n]; j<=c; j++) m[n][j] = v[n];
    //再从n-1往前开始判断第n个物品到第i个物品能不能装下
    for(i=n-1; i>1; i--)
    {
    jMax = min(w[i]-1,c);
    for(j=0; j<=jMax; j++)//背包剩余容量j<=jMax<c
    m[i][j] = m[i+1][j];//无法装入第i个物品
    for(j=w[i]; j<=c; j++)
    m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
    }
    //判断第n个到第1个物品能不能装下
    m[1][c] = m[2][c];
    if(c>=w[1])
    m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
    }
    //x[]数组: 值为0表示不装入背包,值为1表示装入背包
    void Traceback(int (*m)[mn], int *w, int c, int n, int *x)
    {
    int i;
    for(i=1; i<n; i++)
    {
    if(m[i][c] == m[i+1][c])
    x[i]=0;
    else
    {
    x[i]=1;
    c-=w[i];
    }
    }
    x[n]=(m[n][c])?1:0;
    }
    int main()
    {
    int n,c,i;
    printf("请输入物品的数量n=");
    scanf("%d",&n);
    printf("请输入背包的容量c=");
    scanf("%d",&c);
    int w[100];
    printf("请依次输入各物品的重量:");
    for(i=1;i<=n;i++)
    scanf("%d",&w[i]);
    int v[100];
    printf("请依次输入各物品的价值:");
    for(i=1;i<=n;i++)
    scanf("%d",&v[i]);
    int m[mn][mn];
    int x[100];
    int mw=0;
    int mv=0;
    //进行查找与回溯
    Knapsack(v,w,c,n,m);
    Traceback(m,w,c,n,x);
    //输出最优序列和最优重量与最优值
    printf("最优装载序列为:\n");
    for(i=1;i<=n;i++)
    {
    printf("%d",x[i]);
    mw=mw+x[i]*w[i];
    mv=mv+x[i]*v[i];
    }
    printf("\n最大重量为:%d\n最大价值为:%d\n",mw,mv);
    return 0;
    }
    
    
    
    

    img

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

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月8日
  • 已采纳回答 4月8日
  • 赞助了问题酬金15元 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效