#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
TMD 这种水法有意思么。
#1
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
#2
代码排版一下,j-w[i],没判断j<w[i]的情况
#3
TMD 这种水法有意思么。