- 买铅笔
- 2024-04-14 17:26:34 @
/*
重点: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%
- 上传者