Score Inflation

来源:互联网 发布:linux修改网络配置文件 编辑:程序博客网 时间:2024/05/09 23:20

题意:有N组试题,每组试题得分和所需时间分别为worth[i] 和 cost[i],一组试题可以选取多次,求M时间内能得到的最高分为多少?


解题思路

  1. 典型的无界背包问题,用DP解决
  2. 详情参见http://zh.wikipedia.org/wiki/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98

代码

/*ID: zc.rene1LANG: CPROG: 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;}





























原创粉丝点击