leetcode 474. Ones and Zeroes若干0和1组成字符串最大数量+动态规划DP+背包问题

In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue.

For now, suppose you are a dominator of m 0s and n 1s respectively. On the other hand, there is an array with strings consisting of only 0s and 1s.

Now your task is to find the maximum number of strings that you can form with given m 0s and n 1s. Each 0 and 1 can be used at most once.

Note:
The given numbers of 0s and 1s will both not exceed 100
The size of given string array won’t exceed 600.
Example 1:
Input: Array = {“10”, “0001”, “111001”, “1”, “0”}, m = 5, n = 3
Output: 4

Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are “10,”0001”,”1”,”0”
Example 2:
Input: Array = {“10”, “0”, “1”}, m = 1, n = 1
Output: 2

Explanation: You could form “10”, but then you’d have nothing left. Better form “0” and “1”.

这道题其实很简单,怎么最初的时候想不起来怎么做呢,本题就是一个背包问题的改版,看来需要学习和进步的地方实在是太多了,差距还很大啊

还有 leetcode 494. Target Sum目标和 + 背包问题 + 深度优先遍历DFS + 动态规划DP + 简单的分析推导

还建议和leetcode 518. Coin Change 2 动态规划DPleetcode 279. Perfect Squares 类似背包问题 + 很简单的动态规划DP解决leetcode 377. Combination Sum IV 组合之和 + DP动态规划 + DFS深度优先遍历leetcode 416. Partition Equal Subset Sum 动态规划DP + 深度优先遍历DFS一起学习

代码如下:

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <cmath>

using namespace std;

class Solution 
{
public:
    int findMaxForm(vector<string>& strs, int m, int n) 
    {
        //dp[i][j]表示有i个0和j个1可以装下的字符串的数量
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for (string s : strs)
        {
            int numOne = 0, numZero = 0;
            for (char c : s)
            {
                if (c == '0')
                    numZero++;
                else if (c == '1')
                    numOne++;
            }

            for (int i = m; i >= numZero; i--)
            {
                for (int j = n; j >= numOne; j--)
                {
                    dp[i][j] = max(dp[i][j], dp[i - numZero][j - numOne] + 1);
                }
            }

        }
        return dp[m][n];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值