前言
解决以下问题:
1、背包问题的蛮力解决法
【问题描述】有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。
对下表所示的4个物品求出W=6时的所有解和最佳解。
一、实验步骤及结果
#include<stdio.h>
int V[100][100];
int max(int a,int b)
{
if(a>=b)
return a;
else return b;
}
int foolish(int n,int w[],int v[],int x[],int C)
{
int i,j;
for(i=0;i<=n;i++)
V[i][0]=0;
for(j=0;j<=C;j++)
V[0][j]=0;
printf("序号 质量 价值 \n",i,w[i-1],v[i-1]);
for(i=1;i<=n;i++)
{
printf(" %d %d %d ",i,w[i-1],v[i-1]);
for(j=1;j<=C;j++)
{
if(j<w[i-1])
{
V[i][j]=V[i-1][j];
printf("[%d][%d]=%2d ",i,j,V[i][j]);
}
else
{
V[i][j]=max(V[i-1][j],V[i-1][j-w[i-1]]+v[i-1]);
printf("[%d][%d]=%2d ",i,j,V[i][j]);
}
}
printf("\n");
}
j=C;
for(i=n;i>=1;i--)
{
if(V[i][j]>V[i-1][j])
{
x[i]=1;
j=j-w[i-1];
}
else
x[i]=0;
}
printf("选中的物品是:\n");
for(i=1;i<=n;i++){
if(x[i]==1){
printf("第%d个被选择\n",i);
}
else{
printf("第%d个不被选择\n",i);
}
}
return V[n][C];
}
void main()
{
int s;
int w[100];
int v[100];
int x[100];
int n,i;
int C;
n=5;
printf("请输入背包的最大容量:\n");
scanf("%d",&C);
printf("输入物品数:\n");
scanf("%d",&n);
printf("请分别输入物品的重量:\n");
for(i=0;i<n;i++){
printf("\n请输入第%d个物品重量: ",i+1);
scanf("%d",&w[i]);
}
printf("\n请分别输入物品的价值:\n");
for(i=0;i<n;i++){
printf("\n请输入第%d个物品价值: ",i+1);
scanf("%d",&v[i]);
}
s=foolish(n,w,v,x,C);
printf("此时最大物品价值为:\n");
printf("%d\n",s);
}
实验结果:
emmm蛮力有时候很好解决问题,但是这一定是你时间急的情况下,否则其实可以选择更好的方法进行解决。