#include <stdio.h>
int num,c;//物品的种数,背包所能承受的重量
int F[100][100],x[100];
void knapsackP1(int w[],int v[])//动态规划
{
int i=0,j=0,n;
for(i=0;i<=num;i++)
{ if(i==0)
{
for(j=0;j<=c;j++)
F[i][j]=0;
}
else{
for(j=0;j<=c;j++)
{
if(j==0)
F[i][j]==0;
else{
if(j-w[i]>=0)
F[i][j]=F[i-1][j]>(v[i]+F[i-1][j-w[i]])?F[i-1][j]:(v[i]+F[i-1][j-w[i]]);
else F[i][j]=F[i-1][j];
}
}
}
}
for(i=num,j=c,n=0;i>=0;)
{
if(F[i][j]==F[i-1][j])
{
i--;
}
else{
x[n]=i;
n++;
j=j-w[i];
i--;
}
}
printf("被选中的物品数量为:");
for(i=n-1;i>=0;i--)
{
printf("%d ",x[i]);
}
}
int main()
{
printf("请输入物品的种数以及背包所能承受的最大重量:");
scanf("%d%d",&num,&c);
int i,w[c+1],v[c+1];
printf("请输入物品的重量:");
for(i=1;i<=num;i++)
scanf("%d",&w[i]);
printf("请输入物品的价值:");
for(i=1;i<=num;i++)
scanf("%d",&v[i]);
knapsackP1(w,v);
printf("\n背包最大价值为:%d",F[num][c]);
return 0;
}
0-1背包——动态规划(从上到下)
最新推荐文章于 2021-03-20 10:34:50 发布