用动态规划法解决0/1背包问题,运行过程中一直崩,求解救!

时间:2023-01-05 18:43:36
程序如下,大神们帮我看看哪错了把。
#include <stdio.h>

void KnapSack(int n,int c,int w[],int v[])
{
int a[20][20];
int x[20];
for(int i=0;i<=n;i++)   //初始化第0列
a[i][0]=0;
for(int j=0;j<=c;j++)   //初始化第0行
a[0][j]=0;
for(i=1;i<=n;i++)   //计算第i行,进行第i次迭代
for(j=1;j<=c;j++)
{
if(i<w[i-1])
a[i][j]=a[i-1][j];
else
{
if(a[i-1][j]<a[i-1][j-w[i]]+v[i-1])
a[i][j]=a[i-1][j-w[i]]+v[i-1];
else
a[i][j]=a[i-1][j];
}
}
j=c;    //求装入背包的物品
for(i=n;i>0;i--)
{
if(a[i][j]>a[i-1][j])
{
x[i-1]=1;
j=j-w[i-1];
}
else x[i-1]=0;
}
printf("求解矩阵为\n");
for(i=0;i<=c;i++)
for(j=0;j<=n;j++)
{
printf("%d",a[i][j]);
if(j==n)
printf("\n");
}
printf("装入物品的最大价值为:%d\n",a[n][c]);
    printf("装入背包的物品为:");
    for(i=0;i<n;i++)
printf("%d",x[i]);
}

void main()
{
int n,i,c;
int w[20],v[20];
printf("请输入物品数量n(n<20):");
scanf("%d",&n);
printf("请输入背包容量c:");
scanf("%d",&c);
printf("请输入物品重量,以空格为界:");
for(i=0;i<n;i++)
scanf("%d",&w[i]);
printf("请输入物品价值,以空格为界:");
for(i=0;i<n;i++)
scanf("%d",&v[i]);
KnapSack(n,c,w,v);
}
输入数据为:n=5,c=10,物品重量为2,2,6,5,4,价值为6,3,5,4,6
就是得不出结果~
谢谢拉

3 个解决方案

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

#2


代码排版一下,j-w[i],没判断j<w[i]的情况

#3


引用 1 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。


TMD 这种水法有意思么。

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

#2


代码排版一下,j-w[i],没判断j<w[i]的情况

#3


引用 1 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。


TMD 这种水法有意思么。