3760 - 最佳课题选择

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

题目输入

第一行有两个用空格隔开的正整数n和m,分别代表需要完成的论文数和可供选择的课题数。

以下m行每行有两个用空格隔开的正整数。其中,第i行的两个数分别代表与第i个课题相对应的时间系数Ai和指数Bi。

对于30%的数据,n<=10,m<=5;

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

题目输出

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

输入/输出样例

题目输入

10 3
2 1
1 2
2 1

题目输出

19

C++解答

#include<iostream>
#include<cstdio>
using namespace std;
long long num[201][21];
long long f[201];
int n,m,a,b,i,j,k,nums=0;
void zhi(int m,int a,int b)
{
    long long x;
    long long i,j;
    for(i=1;i<=n;i++)
    {
        x=1;
        for(j=1;j<=b;j++)
		{
			x=x*i;
		}
        num[i][m]=a*x;
    }
}
int main()
{
	scanf("%d%d",&n,&m);    
    for(i=1;i<=m;i++)
	{
		f[i]=0x7ffffffffffffff;
	}
    f[1]=0;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        zhi(i,a,b);
    }
    for(i=1;i<=n;i++)
	{
		f[i]=num[i][1];
	}
    for(i=2;i<=m;i++)//循环课题数
    {
        for(j=n;j>=1;j--)//循环容量
        {
            for(k=j-1;k>=0;k--)//循环数
            {
				if(f[j]>f[k]+num[j-k][i])
				{
					f[j]=f[k]+num[j-k][i];
				}
            }
        }
    }
	cout<<f[n]<<endl;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题