#include<stdio.h>
#define N 5
#define M 10
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int main()
{
int peopleneeded[N + 1] = {0, 2, 3, 1, 4, 2};//if we want to dig No. i gold mine, the people we have to use.
int goldprice[N + 1] = {0, 5, 4, 3, 7, 6};//if we dig No. i gold mine, the value we can gain.
int mine[N + 1] = {0};//1 present we should dig No. i gold mine , 0 present not.
int totalvalue[N + 1][M + 1] = {0};
int i, j;//totalvalue[i][j] means the total value if we have j men left, we can gain from the No.1 ~ No. i gold mine. we have i gold mines and j workers.
int p, q;
for ( i = 0; i < N + 1; i++)
totalvalue[i][0] = 0;//if we have 0 people, we can only gain 0 value.
for ( j = 1; j < M + 1; j++)
if(j >= peopleneeded[1])
totalvalue[1][j] = goldprice[1];//if we only have No. 1 gold mine, the value we can gain.
for (i = 2; i <= N; i++)
{
for (j = 1; j <= M; j++)
{
if(peopleneeded[i] > j)
totalvalue[i][j] = totalvalue[i - 1][j];
else
{
totalvalue[i][j] = max(totalvalue[i - 1][j], totalvalue[i - 1][j - peopleneeded[i]] + goldprice[i]);
}
}
}
j = M;
for (q = N; q >= 1; q--)
if(totalvalue[q][j] > totalvalue[q - 1][j])
{
mine[q] = 1;
j -= peopleneeded[q];
}//judge if No.q gold mine should be mined.
printf("the totalvalue table: \n");
printf(" available human resources: ");
for (p = 1; p <= M; p++)
printf("%3d", p);
printf("\n");
for( i = 1; i <= N; i++)
{
printf("the max value from No. 1 ~ No. %d: ", i);
for (j = 1; j <= M; j++)
{
printf("%3d", totalvalue[i][j]);
}
printf("\n");
}
printf("the gold mine we should dig: \n");
for (i = 1; i <= N; i++)
printf("%3d", mine[i]);
printf("\nthe max value from 5 gold mine:\n");
printf("%d", totalvalue[5][10]);
while(1);
return 0;
}
My first 0-1 bag:下图是输出样例: