题意:有N组试题,每组试题得分和所需时间分别为worth[i] 和 cost[i],一组试题可以选取多次,求M时间内能得到的最高分为多少?
解题思路:
- 典型的无界背包问题,用DP解决
- 详情参见http://zh.wikipedia.org/wiki/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98
代码:
/*
ID: zc.rene1
LANG: C
PROG: inflate
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
FILE *fin, *fout;
int M, N;
int *worth, *cost, *result;
int i, j, temp_max;
fin = fopen("inflate.in", "r");
fout = fopen("inflate.out", "w");
fscanf(fin, "%d %d", &M, &N);
worth = (int *)malloc(N*sizeof(int));
cost = (int *)malloc(N*sizeof(int));
for (i=0; i<N; i++)
{
fscanf(fin, "%d %d", &worth[i], &cost[i]);
}
result = (int *)malloc((M+1)*sizeof(int));
memset(result, 0, (M+1)*sizeof(int));
for (i=1; i<=M; i++)
{
temp_max = 0;
for (j=0; j<N; j++)
{
if (cost[j] <= i)
{
if ((worth[j] + result[i - cost[j]]) > temp_max)
{
temp_max = (worth[j] + result[i - cost[j]]);
}
}
}
result[i] = (result[i-1] > temp_max)? result[i-1] : temp_max;
}
fprintf(fout, "%d\n", result[M]);
return 0;
}