[bzoj1618][Usaco2008 Nov]购买干草
Description
约翰的干草库存已经告罄,他打算为奶牛们采购H磅干草.
他知道N个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi磅,需要的开销为Ci美元.每个干草公司的货源都十分充足,可以卖出无限多的干草包.
帮助约翰找到最小的开销来满足需要,即采购到至少H磅干草.
Input
第1行输入N,H.
接下来N行每行输入一个Pi,Ci.
Output
一行一个整数,表示最小的开销.
Sample Input
2 15 3 2 5 3
Sample Output
9
HINT
1≤N≤100,1≤H≤50000,1≤Pi,Ci≤5000
Solution
裸的完全背包问题.
f[i][j]表示前i个公司中已经购买了j磅干草的最小开销.
f[i][j]={f[i−1][j]min(f[i−1][j−Pi],f[i][j−Pi])+Ci
(即买与不买第i个家公司的干草)
P.S.:题目要求的不是=H,而是≥H即可.
#include<cmath> #include<ctime> #include<queue> #include<stack> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 105 #define M 50005 #define INF 1000000000 using namespace std; int f[N][M],p[N],c[N],n,m; inline void init(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d%d",&p[i],&c[i]); for(int i=0;i<=n;++i) for(int j=1;j<=m;++j) f[i][j]=INF; for(int i=1;i<=n;++i){ for(int j=p[i];j<=m;++j) f[i][j]=min(f[i][j],min(f[i-1][j-p[i]],f[i][j-p[i]])+c[i]); for(int j=0;j<p[i];++j) f[i][m]=min(f[i][m],min(f[i-1][m-j],f[i][m-j])+c[i]); for(int j=1;j<=m;++j) f[i][j]=min(f[i][j],f[i-1][j]); } printf("%d\n",f[n][m]); } int main(){ freopen("grass.in","r",stdin); freopen("grass.out","w",stdout); init(); fclose(stdin); fclose(stdout); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· Java轻量级代码工程
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战