luogu P1336 最佳課題選擇 |揹包dp

題目描述

Matrix67要在下個月交給老師n篇論文,論文的內容能夠從m個課題中選擇。因爲課題數有限,Matrix67不得不重複選擇一些課題。完成不一樣課題的論文所花的時間不一樣。具體地說,對於某個課題i,若Matrix67計劃一共寫x篇論文,則完成該課題的論文總共須要花費Ai*x^Bi個單位時間(係數Ai和指數Bi均爲正整數)。給定與每個課題相對應的Ai和Bi的值,請幫助Matrix67計算出如何選擇論文的課題使得他能夠花費最少的時間完成這n篇論文。ios

輸入格式

第一行有兩個用空格隔開的正整數n和m,分別表明須要完成的論文數和可供選擇的課題數。spa

如下m行每行有兩個用空格隔開的正整數。其中,第i行的兩個數分別表明與第i個課題相對應的時間係數Ai和指數Bi。code

輸出格式

輸出完成n篇論文所須要耗費的最少時間。ci


#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=205;
#define int long long
int a[N],b[N],f[N][N];
signed main(){
    int n,m; cin>>n>>m;
    //for(int i=1;i<=m;i++)scanf("%lld%lld",&a[i],&b[i]);
    for(int i=1;i<=m;i++){
        scanf("%lld%lld",&a[i],&b[i]);
        for(int j=1;j<=n;j++){
            for(int k=0;k<=j;k++){
                int p=a[i]*pow(k,b[i]);
                if(f[i][j]==0||i==1)f[i][j]=f[i-1][j-k]+p;
                else f[i][j]=min(f[i][j],f[i-1][j-k]+p);
            }   
        }
    }
    cout<<f[m][n]<<endl;
}
相關文章
相關標籤/搜索