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];
	}
};