zoukankan      html  css  js  c++  java
  • 3.5——课题选择

    题目描述

    Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择。由于课题数有限,Matrix67不得不重复选择一些课题。完成不同课题的论文所花的时间不同。具体地说,对于某个课题i,若Matrix67计划一共写xx篇论文,则完成该课题的论文总共需要花费Ai*xBi个单位时间(系数Ai和指数Bi均为正整数)。给定与每一个课题相对应的Ai和Bi的值,请帮助Matrix67计算出如何选择论文的课题使得他可以花费最少的时间完成这nn篇论文。

    输入

    第一行用空格隔开的正整数n和m,分别代表需要完成的论文数和可供选择的课题数。以下m行每行有两个用空格隔开的正整数。其中,第i行的两个数分别代表与第i个课题相对应的时间系数Ai和指数Bi。

    输出

    输出完成n篇论文所需要耗费的最少时间。

    样例输入

    复制样例数据

    10 3
    2 1
    1 2
    2 1
    

    样例输出

    19
    

    提示

    4篇论文选择课题一,5篇论文选择课题三,剩下一篇论文选择课题二,总耗时为2*4^1+1*1^2+2*5^1=8+1+10=19。可以证明,不存在更优的方案使耗时小于19。

    对于100%的数据,n<=200,m<=20,Ai<=100,Bi<=5。

    #include <iostream>
    typedef long long ll;
    using namespace std;
    #define N 500
    #define inf 0x3f3f3f3f
    ll dp[N];
    ll qpow(int x,int y){
        ll ans=1;
        while(x--){
            ans*=y;
        }
        return ans;
    }
    int main()
    {
        int n,m;
        cin>>n>>m;
        int a[m],b[m],i,j,k;
        ll c[m][n+1];
        for(i=0;i<m;i++){
            cin>>a[i]>>b[i];
            for(j=1;j<=n;j++){
                c[i][j]=a[i]*qpow(b[i],j);
            }
        }
        for(i=0;i<=n;i++){
            dp[i]=inf;
        }
        dp[0]=0;
        for(i=0;i<m;i++){
            for(j=n;j>=0;j--){
                for(k=1;k<=j;k++){
                    dp[j]=min(dp[j],dp[j-k]+c[i][k]);
                }
            }
        }
        cout<<dp[n]<<endl;
        return 0;
    }
    
  • 相关阅读:
    (五)Redis在项目中应用
    股票收益最大问题
    (四)redigo
    (三)go-sql-driver
    为什么TCP要3次握手?4次挥手?
    分支预测
    事务隔离级别说明
    剑指offer解题思路锦集11-20题
    C++中的二义性问题
    memcached Vs redis
  • 原文地址:https://www.cnblogs.com/skyleafcoder/p/12319525.html
Copyright © 2011-2022 走看看