ナップザック問題
Posted: 2014年1月07日(火) 16:58
ナップザック問題を解きたいです。しかし例えば
k=13
n=3
w[0]=10
w[1]=16
w[2]=2
という入力に対して
最大値--->0
組合せ--->
と返ってきてしまいます。恐らく配列a[d]にうまく0,1を入れることができていないのだと思います。助けて下さい。よろしくお願いします。
OS Windows7
コンパイラ gcc
k=13
n=3
w[0]=10
w[1]=16
w[2]=2
という入力に対して
最大値--->0
組合せ--->
と返ってきてしまいます。恐らく配列a[d]にうまく0,1を入れることができていないのだと思います。助けて下さい。よろしくお願いします。
OS Windows7
コンパイラ gcc
#include<stdio.h>
#define MAX (500)
int i,k,n,w[MAX],max=0,o[MAX];
void bi(int d);
int main(void)
{
printf("\nナップザックの最大容量kを教えて下さい.--->");
scanf("%d",&k);
printf("%d\n\n",k);
printf("用意された品物の個数nを教えて下さい.--->");
scanf("%d",&n);
printf("%d\n\n",n);
printf("%d個の品物について,重さweightを教えて下さい.\n",n);
for(i=0;i<n;++i){scanf("%d",&w[i]);}
for(i=0;i<n-1;++i){printf("%d,",w[i]);}
printf("%d\n\n",w[n-1]);
if (n<=0) printf("nは自然数にしてください.\n");
else bi(0);
printf("\n");
printf("最大値--->%d\n",max);
printf("組合せ--->\n");
for(i=0;i<n;++i){
if(o[i]==1) printf("w[%d]",i);}
printf("\n");
}
void bi(int d)
{
int i,total=0,a[MAX];
if(d==n){
for(i=0;i<n;++i){
if(a[i]==1){
total+=w[i];
}
}
if(total<=k && total>max){
max=total;
for(i=0;i<n;++i){
o[i]=a[i];
}
}
}
else{
a[d]=0;
bi(d+1);
a[d]=1;
bi(d+1);
}
}