記事ディレクトリ
序文
以下の問題を解いてください。
1. ナップザック問題の強引な解法
[問題説明] 重み {w1, w2, ..., wn} の n 個のアイテムがあり、それらの値は {v1, v2, ... です。 , vn}, 容量 W のナップザックを考える. これらのアイテムからいくつかのアイテムを選択してバックパックに入れる計画を立てます. それぞれのアイテムは選択されているか選択されていないかのどちらかです. 選択されたアイテムはバックパックに入れられるだけでなく、最大の価値を持っている必要があります. .
下の表の4つの項目について、W=6のときの全解と最適解を求めよ。
1. 実験手順と結果
#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 ブルート フォースは問題を非常にうまく解決できる場合がありますが、これは急いでいる場合に違いありません。