Codeforces Beta Round #82 (Div. 2) 动态规划

来源:互联网 发布:知无涯者怎么解释 编辑:程序博客网 时间:2024/06/08 15:43

原题在这里C. Buns

题目是关于烤面包的一个规划,已知目前还有n克生面团,m种不同的馅料编号1~m,其中第i种馅料剩余ai克,用bi克的馅料和ci克的的生面团可以拷一个面包卖di元。当然也可以拷不带馅料的面包,每一个面包用c0克的面团卖d0元,直到用光所有的馅料和生面团(最后剩下的材料不足够做一个面包则丢弃),问你当前材料下最多能卖多少钱。

代码如下:

//动态规划,参考了别人的代码#include<iostream>#include<algorithm>using namespace std;int n, m, c0, d0;//第一行的输入int a, b, c, d;int dp[1111];int main() {cin >> n >> m >> c0 >> d0;for (int i = c0; i <= n; i++) dp[i] = dp[i - c0] + d0;//dp[i]表示只有i克生面团不带馅最多能卖多少钱,此递推公式可以自己尝试推一下,显然等于上一个加上d0for (int i = 0; i<m; i++) {cin >> a >> b >> c >> d;//a是剩余的s,每做一个要费b克for (int j = 0; j<(a / b); j++) //a/b表示剩余的馅料最多可以做多少个面包{for (int k = n; k >= c; k--){dp[k] = max(dp[k], dp[k - c] + d);}}}cout << dp[n] << endl;//dp[n]表示用光所有的生面团所能卖的最多钱return 0;}

感觉动态规划算法不是特别难,但难就难在递归方程的推导和最终输出量的表示。只要把这两个搞明白了,感觉剩下的就是一个枚举比较的过程。可能以后多做一些题目就越来越能理解和体会动态规划了。

0 0