SDUTOJ 2773 小P的故事——神奇的Dota 枚举或背包或搜索

来源:互联网 发布:淘宝直通车选词2016 编辑:程序博客网 时间:2024/05/16 15:57

小P的故事——神奇的Dota

Time Limit: 1000MS Memory limit: 65536K

题目描述

小P非常喜欢玩dota,不分昼夜的玩
,结果他连做梦也都是里面的画面,一天晚上小P刚躺下就做了一个神奇的梦。。。
不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前.
死亡骑士:"我要买道具!"
地精商人:"我们这里有三种道具,血瓶150块一个,魔法药200块一个,无敌药水350块一个."
死亡骑士:"好的,给我一个血瓶."
说完他掏出那张N元的大钞递给地精商人.
地精商人:"我忘了提醒你了,我们这里没有找客人钱的习惯的,多的钱我们都当小费收了的,嘿嘿."
死亡骑士:"......"
死亡骑士想,与其把钱当小费送个他还不如自己多买一点道具,反正以后都要买的,早点买了放在家里也好,但是要尽量少让他赚小费.
现在死亡骑士感觉自己的智商不够用所以希望小P帮他计算一下,最少他要给地精商人多少小费.但是小P的智商可是出了名的“不忍直视”啊,聪明非凡的你所以你能帮帮他吗?

输入

输入数据的第一行是一个整数T(1<=T<=100),代表测试数据的数量.然后是T行测试数据,每个测试数据只包含一个正整数N(1<=N<=10000),N代表死亡骑士手中钞票的面值.
 
注意:地精商店只有题中描述的三种道具.

输出

 对于每组测试数据,请你输出死亡骑士最少要浪费多少钱给地精商人作为小费.
 

示例输入

2 380 200

示例输出

30 0

提示

 

来源

xfl

枚举算法:

#include <stdio.h>#include <string.h>int main(){    int n,a = 150,b = 200,c = 350,m;    while(~scanf("%d",&m))    {        while(m--)        {            scanf("%d",&n);            int mx = 0;            int x = n / a;            int y = n / b;            int z = n / c;            for(int i = 0; i <= x; i++)            {                for(int j = 0; j <= y; j++)                {                    for(int k = 0; k <= z; k++)                    {                        int sum = a * i + b * j + c * k;                        if(sum > n)                            break;                        if(mx < sum)                            mx = sum;                        if(mx == n)                            break;                    }                    if(a * i + b * j > n)                        break;                }            }            printf("%d\n",n - mx);        }    }    return 0;}

背包算法:

#include <stdio.h>#include <string.h>#define max(a,b) (a)>(b)?(a):(b)int v[] = {150,200,350};int dp[32768];int main(){    int t,n;    while(~scanf("%d",&t))    {        while(t--)        {            memset(dp,0,sizeof(dp));            scanf("%d",&n);            for(int i = 0;i < 3;i++)            {                for(int j = v[i];j <= n;j++)                {                    dp[j] = max(dp[j],dp[j - v[i]] + v[i]);                }            }            printf("%d\n",n - dp[n]);        }    }    return 0;}

BFS搜索:

#include <stdio.h>#include <string.h>#include <queue>using namespace std;bool hs[32769];queue <int> q;int bh[] = {150,200,350};int mx;void bfs(int s,int n){    int t,f;    memset(hs,false,sizeof(hs));    while(!q.empty())        q.pop();    q.push(s);    hs[s] = true;    while(!q.empty())    {        t = q.front();        q.pop();        for(int i = 0;i < 3;i++)        {            f = t + bh[i];            if(f < n && !hs[f])            {                q.push(f);                if(mx < f)                    mx = f;                hs[f] = true;            }            else if(f == n)            {                printf("0\n");                return ;            }        }    }    printf("%d\n",n - mx);}int main(){    int t,n;    while(~scanf("%d",&t))    {        while(t--)        {            scanf("%d",&n);            mx = 0;            bfs(0,n);        }    }    return 0;}





0 0
原创粉丝点击