#include <stdio.h>
#include <stdlib.h>
#define BUDGET 20
#define N 5
int VORP[N+1]={0,2,9,1,3,8};
int COST[N+1]={0,3,8,1,4,10};
void dp(int**DP,int**Trace)
{
for(int i=1;i<N+1;i++)
{
for(int j=COST[i];j<BUDGET+1;j++)
{
int x=DP[i-1][j-COST[i]]+VORP[i];
int y=DP[i-1][j];
if(x>=y)//雇佣
{
DP[i][j]=x;
Trace[i][j]=j-COST[i];
}
else//不雇佣
{
DP[i][j]=y;
Trace[i][j]=j;
}
}
}
}
void printDP(int**DP)
{
for(int i=0;i<N+1;i++)
{
for(int j=0;j<BUDGET+1;j++)
{
printf("%2d ",DP[i][j]);
}
printf("\n");
}
}
void getTrace(int**Trace)
{
int j=BUDGET;
for(int i=N;i>=1;i--)
{
if(Trace[i][j]==j-COST[i])
printf("%d ",VORP[i]);
j=Trace[i][j];
}
printf("\n");
}
void main()
{
int **DP=(int**)malloc((N+1)*sizeof(int*));
int **Trace=(int**)malloc((N+1)*sizeof(int));
for(int i=0;i<N+1;i++)
{
DP[i]=(int*)malloc((BUDGET+1)*sizeof(int));
Trace[i]=(int*)malloc((BUDGET+1)*sizeof(int));
}
for(int i=0;i<N+1;i++)
{
for(int j=0;j<BUDGET+1;j++)
{
DP[i][j]=0;
Trace[i][j]=0;
}
}
dp(DP,Trace);
printDP(DP);
printf("\n");
printDP(Trace);
printf("\n");
getTrace(Trace);
getchar();
}