P1336 最佳课题选择

题意:给出我们需要学的科目数,给出m种不同的科目,n<=m

    即可以学的科目数小于我们需要学的科目数,也就是说我们需要多次学同一门科目

      计算学习某门科目的时间为:

 

        求如何学习才能让时间最低;

思路:给出dp【i】【j】表示选择前i种科目学习j次所花最少时间

   

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=2e3+10;
 5 ll dp[maxn][maxn];
 6 ll a[maxn],b[maxn];
 7 ll qpow(ll x,ll y)
 8 {
 9     ll sum=1;
10     while(y){
11         if(y&1) sum=sum*x;
12         x=x*x;
13         y/=2;
14     }
15     return sum;
16 }
17 int main()
18 {
19     int n,m;
20     scanf("%d%d",&n,&m);
21     for(int i=1;i<=m;i++){
22         scanf("%lld%lld",&a[i],&b[i]);
23     }
24     for(int i=1;i<=n;i++)
25         dp[1][i]=a[1]*qpow(i,b[1]);
26     for(int i=1;i<=m;i++)
27         dp[i][0]=0;
28     for(int i=2;i<=m;i++){
29         for(int j=1;j<=n;j++){
30             int tot=j;
31             dp[i][j]=a[i]*qpow(j,b[i]);
32             for(int k=0;k<tot;k++){
33                 dp[i][j]=min(dp[i][j],dp[i-1][tot-k]+a[i]*qpow(k,b[i]));
34             }
35         }
36     }
37     printf("%lld\n",dp[m][n]);
38     return 0;
39 }
View Code

 

posted @ 2020-03-30 18:56  古比  阅读(151)  评论(0编辑  收藏  举报