您的位置:首页 > 其它

(p244)01背包问题

2016-03-27 14:24 253 查看
#include<stdio.h>
#define maxn 100
#define maxw 1000
int w[maxn+1]={0,10,20,30},v[maxn+1]={0,60,100,120},d[maxn+1][maxw+2],n=3,W=50,ans;//现在才知道大数组要声明为全局变量才不会报错
int select(int w[],int v[],int n,int W)
{
int i,j,f[maxn+1][maxn+1];//f[i][j]表示可用空间为j时在前i个物品中选取所能取得的最大值
for (i=0;i<=n;i++)
for (j=0;j<=W;j++)
{
f[i][j]=0;
d[i][j]=0;//d[i][j]表示f[i][j]对应的最后一个物品,用来记录物品,也就是继承关系
}
for (i=1;i<=n;i++)
for (j=0;j<=W;j++)
{
f[i][j]=f[i-1][j];
d[i][j]=d[i-1][j];
if ((w[i]<=j)&&(f[i-1][j-w[i]]+v[i]>f[i][j]))
{
f[i][j]=f[i-1][j-w[i]]+v[i];
d[i][j]=i;
}
}
return f
[W];
}
int print(int d[][maxw+2],int i,int j)
{
while (i>=1)
{
if (i==d[i][j])
{
printf("%d ",i);
j-=w[i];
i=d[i-1][j];
}
else
i=d[i-1][j];
}
printf("\n");
return 0;
}
int main(void)
{
ans=select(w,v,n,W);
printf("%d\n",ans);
print(d,n,W);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: