zoukankan      html  css  js  c++  java
  • B.魔法数字(BFS搜索)/C.牛妹的春游(二维费用的背包问题)

    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];
    	}
    };
    
  • 相关阅读:
    luogu1196 银河英雄传说 (并查集)
    [BZOJ2243][SDOI2011]染色
    [BZOJ1879] [Sdoi2009]Bill的挑战
    [Noip2003] 侦探推理
    [Noip2005] 篝火晚会
    [JZOJ100047] 【NOIP2017提高A组模拟7.14】基因变异
    [九省联考2018]一双木棋chess
    [Noip2009] 靶形数独
    [Luogu2737] [USACO4.1]麦香牛块Beef McNuggets
    [BZOJ3109] [cqoi2013]新数独
  • 原文地址:https://www.cnblogs.com/pixel-Teee/p/13276770.html
Copyright © 2011-2022 走看看