TOJ3232TOJ礼品兑换

来源:互联网 发布:java游戏制作 编辑:程序博客网 时间:2024/06/02 22:09

3232: TOJ礼品兑换

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 136            测试通过:91

描述

近期crq老师为了提高各个学生对ACM的兴趣,在TOJ上增加了积分制度和礼品兑换功能, TOJ的积分是来之不易的,固然同学们都想用同一积分换取最大价值的礼品,某同学用了M的积分换取了一些礼品。 请问:他用M的积分最多能换取多少价值的礼品呢? (积分M一定要使用完)

输入

输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数M和N(1<=M<=1000,1<=N<=100),分别表示换取的总积分和礼品的种类,然后是N行数据,每行包含3个数p,h和c(1<=p<=100,0<=h<=200,1<=c<=1000),分别表示每种礼品的价格、对应种类礼品的剩余数目以及每类礼品的消耗的积分。

输出

对于每组测试数据,如果M能使用完请输出"The maximum value is X." ,否则输出"This is impossible.".你可以假设同一类物品能多次换取。每个实例的输出占一行。

样例输入

3700 310 2 10065 5 50024 10 200273 457 190 5351 66 38392 65 9161 126 364273 257 190 5361 126 364

样例输出

The maximum value is 89.The maximum value is 276.This is impossible.

题目来源

TOJ

#include <stdio.h>#include <string.h>int main(){int n,i,j,l,m,t,q[1005],p,h,c;scanf("%d",&t);while(t--){memset(q,0,sizeof(q));scanf("%d %d",&m,&n);while(n--){scanf("%d %d %d",&p,&h,&c);for(i=0;i<h;i++){for(j=m;j>=c;j--){if(q[c]<p)q[c]=p;if(q[j-c]&&q[j-c]+p>q[j]){q[j]=q[j-c]+p;}}}}if(q[m])printf("The maximum value is %d.\n",q[m]);elseprintf("This is impossible.\n");}} 


0 0