Directorio de artículos
prefacio
Resuelve los siguientes problemas:
1. Solución de fuerza bruta al problema de la mochila
[Descripción del problema] Hay n elementos con pesos {w1, w2, ..., wn}, y sus valores son {v1, v2, ... , vn}, Dada una mochila de capacidad W. Diseñe un plan para seleccionar algunos elementos de estos elementos y ponerlos en la mochila. Cada elemento se selecciona o no se selecciona. Se requiere que los elementos seleccionados no solo puedan colocarse en la mochila, sino que también tengan el mayor valor. .
Encuentre todas las soluciones y la mejor solución cuando W=6 para los 4 elementos que se muestran en la siguiente tabla.
1. Procedimientos y resultados experimentales
#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);
}
Resultados experimentales:
Emmm, la fuerza bruta a veces puede resolver problemas muy bien, pero esto debe ser cuando tienes prisa, de lo contrario, puedes elegir un método mejor para resolverlo.