/*
重点:SB老师可以买多种铅笔,不像NOXP2016T1那样(那时候这位老师只能买一种铅笔),所以数论不行,只能动规。那动规该怎么打呢?先推状态转移方程!方程如下:
dp[i][j]=0x7f7f7f7f;(预处理)
dp[i][j]=val[j];(i<=num[j])     ### num[j]是支数,val[j]是价格
dp[i][j]=min(dp[i][j],dp[i-num[j]][t]+val[j]);(1<=i<=n+101)
此时有一个华生发现了盲点:为什么i的范围是i<=n+101呢?
答曰:多买几支可能会赚,最多多买几支呢?那就是max(num[j]),即100(保守起见再加个一)
最后在n~n+101里找最小价格,输出即可

此题题解自研,抄题解者死
*/
#include<bits/stdc++.h>
using namespace std;
int num[5],val[5],n,dp[4000105][5],ans=INT_MAX;
int main()
{
    ios::sync_with_stdio(false);
    memset(dp,0x7f7f7f7f,sizeof dp);
    cin>>n;
    for(int i=1;i<=3;i++)
        cin>>num[i]>>val[i];
    for(int i=1;i<=3;i++)
        for(int j=1;j<=num[i];j++)
            dp[j][i]=val[i];
    for(int i=1;i<=n+101;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(i-num[j]<=0)continue;
            for(int t=0;t<=3;t++)
                dp[i][j]=min(dp[i][j],dp[i-num[j]][t]+val[j]);
        }
    }
    for(int i=n;i<=n+101;i++)
        for(int j=1;j<=3;j++)
            ans=min(ans,dp[i][j]);
    cout<<ans<<endl;
    return 0;
}

欢迎来到这个疯狂年代
https://vijos.org/d/wjszez/ranking

0 条评论

目前还没有评论...

信息

ID
2641
难度
8
分类
(无)
标签
递交数
23
已通过
4
通过率
17%
上传者