算法代码
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
const int N=4;
const int C=9;
int Knapsack_optimization(int S[],int P[],int OC[])
{
for(int i=1; i<=N;i++)
for(int j=C;j>=S[i];j--)
OC[j]= OC[j] > (P[i] + OC[j-S[i]]) ? OC[j] : (P[i] + OC[j-S[i]]);
return OC[C];
}
int Knapsack_Positive(int S[],int P[])
{
int i,j;
int V[C+1]={0,};
int m[C+1]={0,};
for (i=1; i<=N;i++)
for (j=1;j<=C;j++)
if (S[i] <= j&&m[j-S[i]]!=i&&V[j] < (V[j-S[i]]+P[i]))
{
V[j]= V[j-S[i]]+P[i] ;
m[j]=i;
}
return V[C];
}
int Knapsack_recursion(int S[],int P[],int key ,int s)
{
if(key>N||s+S[key]>C) return 0;
if(key==N) return P[key];
return Knapsack_recursion(S,P,key+1,s)>(P[key]+Knapsack_recursion(S,P,key+1,s+S[key]))
?Knapsack_recursion(S,P,key+1,s):(P[key]+Knapsack_recursion(S,P,key+1,s+S[key]));
}
int Knapsack(int S[],int P[],int V[][C+1])
{
for (int i=0;i<=N;i++)
V[i][0]=0;
for (int j=0;j<=C;j++)
V[0][j]=0;
for (i=1; i<=N;i++)
for (j=1;j<=C;j++)
if (S[i] > j)
V[i][j]=V[i-1][j];
else
V[i][j]=V[i-1][j]>(V[i-1][j-S[i]]+P[i])?V[i-1][j]:(V[i-1][j-S[i]]+P[i]);
return V[N][C];
}
void table(int S[],int P[],int V[][C+1])
{
int i,j;
printf("S: 0 2 3 4 5\n");
printf("P: 0 3 4 5 7\n");
printf("C =%2d ",C);
for(i=0;i<=C;i++)
printf("%3d",i);
printf("\n ");
for(i=1;i<=C+1;i++)
printf("%3d",0);
printf("\n");
for(i=1;i<=N;i++)
{
printf("V[%d]=%2d",i,S[i]);
for(j=0;j<=C;j++)
printf("%3d",V[i][j]);
printf("\n");
}
}
void main ()
{
int S[N+1]={0,2,3,4,5};
int P[N+1]={0,3,4,5,7};
int V[N+1][C+1];
int OC[C+1]={0,};
Knapsack(S,P,V);
table(S,P,V);
printf("\nKnapsack : %d\n",Knapsack(S,P,V) );
printf("\nKnapsack_recursion : %d\n",Knapsack_recursion(S,P,1,0) );
printf("\nKnapsack_Positive : %d\n",Knapsack_Positive(S,P) );
printf("\nKnapsack_optimization : %d\n\n\n",Knapsack_optimization(S,P,OC) );
system("pause");
}
测试结果
