zoukankan      html  css  js  c++  java
  • 2015暑假多校联合---CRB and His Birthday(01背包)

    题目链接

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5410

    Problem Description
    Today is CRB's birthday. His mom decided to buy many presents for her lovely son.
    She went to the nearest shop with M Won(currency unit).
    At the shop, there are N kinds of presents.
    It costs Wi Won to buy one present of i-th kind. (So it costs k × Wi Won to buy k of them.)
    But as the counter of the shop is her friend, the counter will give Ai × x + Bi candies if she buys x(x>0) presents of i-th kind.
    She wants to receive maximum candies. Your task is to help her.
    1 ≤ T ≤ 20
    1 ≤ M ≤ 2000
    1 ≤ N ≤ 1000
    0 ≤ Ai, Bi ≤ 2000
    1 ≤ Wi ≤ 2000
     
    Input
    There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
    The first line contains two integers M and N.
    Then N lines follow, i-th line contains three space separated integers WiAi and Bi.
     
    Output
    For each test case, output the maximum candies she can gain.
     
     
    Sample Input
    1
    100 2
    10 2 1
    20 1 1
     
    Sample Output
    21
     
    Hint
    CRB's mom buys 10 presents of first kind, and receives 2 × 10 + 1 = 21 candies.
     
    Author
    KUT(DPRK)
     
    Source
     
    Recommend
    wange2014
     
    题意:输入M,N,分别表示总的钱数和物品种数,接下来输入N行,每行3个数,单价、买一件送的糖数 、买一次送的糖数   求最多能得到多少糖?
     
    思路:01背包,dp[i]表示i钱下能得到最多的糖数,vis[i][j]表示i钱下得到最多糖时,是否买j物品,状态转移方程dp[i]=dp[i-kind[j][0]]+kind[j][1]+(vis[i-kind[j][0]][j]==0) * kind[j][2];
     
    代码如下:
     
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #define eps 1e-8
    #define maxn 105
    #define inf 0x3f3f3f3f3f3f3f3f
    #define IN freopen("in.txt","r",stdin);
    using namespace std;
    int dp[2005];
    int vis[2005][1005];
    int kind[1005][3];
    
    int main()
    {
        int T;
        int M,N;
        cin>>T;
        while(T--)
        {
            scanf("%d%d",&M,&N);
            for(int i=0;i<N;i++)
                scanf("%d%d%d",&kind[i][0],&kind[i][1],&kind[i][2]);
            memset(dp,0,sizeof(dp));
            memset(vis,0,sizeof(vis));
    
            for(int i=1;i<=M;i++)
            {
                int flag=-1;
                for(int j=0;j<N;j++)
                {
                    if(i<kind[j][0]) continue;
                    int s=dp[i-kind[j][0]]+kind[j][1];
                    if(!vis[i-kind[j][0]][j]) s+=kind[j][2];
                    if(dp[i]<s)
                    {
                        dp[i]=s;
                        flag=j;
                    }
                }
                if(flag>=0)
                {
                    for(int j=0;j<N;j++)
                    {
                        vis[i][j]=vis[i-kind[flag][0]][j];
                    }
                    vis[i][flag]++;
                }
            }
            int tmp=0;
            for(int i=1;i<=M;i++)
               tmp=max(tmp,dp[i]);
            printf("%d
    ",tmp);
        }
        return 0;
    }
  • 相关阅读:
    VS2013专业版+QT5.6.3+qt-vs-addin-1.2.5环境搭建
    提权获取进程路径并获取进程列表
    解决Qt发布的程序在xp环境下提示“无法定位程序输入点 K32GetModuleFileNameExA 于动态链接库 KERNEL32.dll 上”的错误
    QT5中使用Echarts图表组件
    Qt5.9生成dll详细图文教程
    Qt 编程指南 & 选择合适的Qt5版本
    Qt 之 国际化(中英文切换)
    Qt资料
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/chen9510/p/5835592.html
Copyright © 2011-2022 走看看