HDoj 1248寒氷王座【完全リュック】

2038 ワード

氷の王座
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12612    Accepted Submission(s): 6397
Problem Description
不死族の巫妖王は给料をもらって、死の骑士は1枚のN元の札(覚えていて、1枚の札しかありません)をもらって、自分が戦闘の中で频繁に死ぬことを防止するために、彼は自分にいくつかの道具を买うことを决めて、そこで彼は地精商店の前に来ました.
死の騎士「道具を買いたい!」
地精商人:「ここには3つの道具があります.血瓶は150元で、魔法薬は200元で、無敵薬は350元です.」
死の騎士「はい、血の瓶をください.」
そう言って彼はそのN元の札を取り出して地精商人に渡した.
地精商人:「注意するのを忘れました.ここにはお客さんを探す習慣がありません.たくさんのお金はチップとして受け取りました.へへへ.」
デスナイト「…」
死の騎士は、お金をチップとして送るよりも、自分でもっと道具を買ったほうがいいと思っています.どうせこれから買うから、早く買って家に置いてもいいですが、できるだけチップを稼がせないようにしなければなりません.
今、死の騎士はあなたが彼に計算してほしいと思っています.少なくとも彼は地精商人にいくらチップをあげますか.
Input
入力データの最初の行は整数T(1<=T<=100)であり、テストデータの数を表す.次にT行のテストデータであり、各テストデータは正の整数N(1<=N<=10000)のみを含み、Nはデスナイトの手にある紙幣の額面を表す.
注意:地精商店には問題に説明されている3つの道具しかありません.
Output
各グループのテストデータについて、死の騎士が少なくともいくらを浪費して地精商人にチップとしてあげなければならないかを出力してください.
Sample Input

   
   
   
   
2 900 250

Sample Output

   
   
   
   
0 50

テンプレート:
 
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
int max(int x,int y)
{
    return x>y?x:y;
}
int dp[10100];
int main()
{
    int t,money;
    int i,j;
    int value[3]={150,200,350};
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&money);
        memset(dp,0,sizeof(dp));
        for(i=0;i<3;i++)
        {
            for(j=value[i];j<=money;j++)
            {
                dp[j]=max(dp[j],dp[j-value[i]]+value[i]);
            }
        }
        printf("%d
",money-dp[money]); } return 0; }