本文主要是介绍【牛客网】创造新世界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/*******************************************************************
问题描述:
众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。
输入描述:
输入数据包括x+1行:第一行包括三个整数x(2 ≤ x ≤ 20),n(0 ≤ n ≤ 500),m(0 ≤ m ≤ 500),以空格分隔接下来的x行,每行一个01串item[i],表示第i个物品。每个物品的长度length(1 ≤ length ≤ 50)
输出描述:
输出一个整数,表示牛牛最多能创造多少种物品
输入例子:
3 3 1
1
00
100
输出例子:
2
********************************************************************/
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
//统计 字符串中 0 和 1 的个数
void count(string s,vector<int> &zeros,vector<int> &ones,int i)
{
int numOf0 = 0,numOf1 = 0;
for(int ii=s.size()-1;ii>=0;--ii)
{
if(s[ii] =='0')
{
++numOf0;
}
else
{
++numOf1;
}
}
zeros[i] = numOf0;
ones[i] = numOf1;
}
int main()
{
int x,n,m;
cin>>x>>n>>m;
vector<int> zeros(20,0);
vector<int> ones(20,0);
vector<vector<int>> dp(501,vector<int>(501,0));
string s;
for(int ii = 0;ii<x;ii++)
{
cin>>s;
count(s,zeros,ones,ii);
}
//动态规划 0-1背包问题
for(int ii = 0;ii<x;ii++)
for(int jj = n;jj>=zeros[ii];--jj)
for(int kk=m;kk>=ones[ii];--kk)
{
dp[jj][kk] = max(dp[jj][kk],dp[jj- zeros[ii]][kk - ones[ii]]+1);
}
cout<<dp[n][m]<<endl;
}
这篇关于【牛客网】创造新世界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!