B.魔法数字
题目链接:https://ac.nowcoder.com/acm/contest/6218/B
分析:像这种生成数字的题目,可以用BFS,每次操作当成一次花费+1。需要剪枝。
class Solution {
public:
/**
* 返回最后要输出的答案
* @param n int整型 表示牛牛的数字
* @param m int整型 表示牛妹的数字
* @return int整型
*/
int dist[5005];
int bfs(int n, int m)
{
memset(dist, -1, sizeof dist);
queue<int> q;
q.push(n);
dist[n] = 0;
while(q.size())
{
int t = q.front();
if(t == m) return dist[t];
q.pop();
if(t + 1 <= 2 * m && dist[t + 1] == -1)
{
dist[t + 1] = dist[t] + 1;
q.push(t + 1);
}
if(t - 1 >= 1 && dist[t - 1] == -1)
{
dist[t - 1] = dist[t] + 1;
q.push(t - 1);
}
if(t * t <= 4 * m && dist[t * t] == -1)
{
dist[t * t] = dist[t] + 1;
q.push(t * t);
}
}
}
int solve(int n, int m) {
if (n == m) return 0;
int res = bfs(n, m);
return res;
}
};
C.牛妹的春游(二维费用的背包问题)
[题目链接:https://ac.nowcoder.com/acm/contest/6218/C]
这是道二维费用的背包问题,也可以像01背包一样优化掉第一维的决策,但是其它的循环就要倒序。还有这道题要求可以买的面包数量和饮料数量可以多出来,只要买够就行,循环决策的时候,我们可以对负数取0,代表者我买的饮料或者面包不需要那么多,但是可以买那么多。
class Solution {
public:
/**
*
* @param breadNum int整型
* @param beverageNum int整型
* @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
* @return int整型
*/
int dp[2000][2000];
int minCost(int a, int b, vector<vector<int> >& p) {
memset(dp, 0x3f, sizeof dp);
dp[0][0] = 0;
for (int i = 0; i < p.size(); ++i)
for (int j = a; j >= 0; --j)
for (int k = b; k >= 0; --k)
{
dp[j][k] = min(dp[j][k], dp[max(j - p[i][0], 0)][max(k - p[i][1], 0)] + p[i][2]);
}
return dp[a][b];
}
};