• 暗黑破坏神


    暗黑破坏神
    【问题描述】
      游戏的主人公有n个魔法,每个魔法分为若干个等级,第i个魔法有p[i]个等级(不包括0),每个魔法的每个等级都有一个效果值,一个j级的i种魔法的效果值为w[i][j],魔法升一级需要一本相应的魔法书,购买魔法书需要金币,第i个魔法的魔法书价格为c[i],而小x只有m个金币(好孩子不用修改器)
      你的任务就是帮助小x决定如何购买魔法书才能使所有魔法的效果值之和最大,开始时所有魔法为0级效果值为0。
    【输入格式】diablo.in
      第一行用空格隔开的两个整数n,m。
      以下n行,描述n个魔法,第i+1行描述第i个魔法。格式如下
      c[i] p[i] w[i][1] w[i][2] ... w[i][p[i]]
    【输出格式】diablo.out
      第一行输出一个整数,即最大效果值。
      以后n行输出你的方案:
      第i+1行有一个整数v[i] 表示你决定把第i个魔法学到v[i]级
      如果有多解输出花费金币最少的一组
      如果还多解输出任意一组
    【输入样例】
      3 10
      1 3 1 2 2
      2 3 2 4 6
      3 3 2 1 10
    【输出样例】
      11
      1
      0
      3


    #include<iostream>
    using namespace std;
    int n,m;
    int v[101],c[101],p[101],w[101][51];
    int f[101][51],d[101][51];
    void shuchu(int a,int b)//递归输出所选择的每个魔法的等级
    {
    if(a==0) return ;
    else
    {
    shuchu(a-1,b-d[a][b]*c[a]);
    cout<<d[a][b]<<endl;
    }
    }
    int main()
    {
    cin>>n>>m; //n个魔法,m个金币
    for(int i=1;i<=n;i++)
    {
    cin>>c[i]>>p[i];//第i个魔法价格为c[i],有p[i]个等级
    for(int j=1;j<=p[i];j++)
    cin>>w[i][j];//第i个魔法的第j个等级的效果值为w[i][j]
    }
    for(int i=1;i<=n;i++)//i个魔法
    for(int j=1;j<=m;j++)//j个金币
    for(int k=0;k<=p[i];k++) //第i个魔法第k个等级
    {
    if(j<k*c[i]) break;//如果金币少于第i个魔法第k个等级的钱数 则跳出
    else //否则计算到第i个魔法花费j个金币所取得的最大效果值
    {
    f[i][j]=max(f[i][j],f[i-1][j-k*c[i]]+w[i][k]);
    d[i][j]=k;//d[i][j]表示第i个魔法花费j金币时选择的等级为k
    }
    }
    cout<<f[n][m]<<endl;
    shuchu(n,m);
    return 0;
    }

  • 相关阅读:
    msvcr120.dll、msvcp120.dll注册失败
    Qt初级-Qt格式
    二级指针的申请与释放
    搜索指定目录下的所有文件或者指定文件(可用于多级目录)
    Java--多线程处理--模拟车辆进入入收费
    Sqlit--学习教程(建立数据库表)
    Sqlit--学习教程(基本操作1)
    Sqlit--学习教程()
    Sqlit--学习教程(命令)
    Sqlit--学习教程(简介)
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5325737.html
Copyright © 2020-2023  润新知