【程序】
#include <stdio.h>
#define N 105
int a[N][N],w[N],v[N];
//背包问题
int F1(int m,int n) //顺推,非递归算法
{
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(w[i]>j) //不能放
a[i][j]=a[i-1][j];
else //能放
a[i][j]=a[i-1][j]>v[i]+a[i-1][j-w[i]]?a[i-1][j]:v[i]+a[i-1][j-w[i]];
return a[m][n];
}
int F2(int m,int n) //逆推,递归算法
{
if(m==0||n==0)
return 0;
else if(w[m]>n)
return F2(m-1,n);
else
return F2(m-1,n)>v[m]+F2(m-1,n-w[m])?F2(m-1,n):v[m]+F2(m-1,n-w[m]);
}
int main()
{
int i,j,n,m,result; //n表示背包容量,m表示物品个数
printf("背包容量:");
scanf("%d",&n);
for(i=0;i<=n;i++) //先把数组0行0列赋初值为0
a[0][i]=a[i][0]=0;
printf("物品个数:");
scanf("%d",&m);
printf("物品\t重量\t价值/美元\n");
for(i=1;i<=m;i++)
{
printf("%d\t",i);
scanf("%d%d",&w[i],&v[i]);
}
result=F1(m,n);
printf("非递归方法最优结果:%d\n",result);
result=F2(m,n);
printf("递归方法最优结果:%d\n",result);
}