创造新世界--全国模拟(二)

[编程题] 创造新世界
时间限制:1秒
空间限制:32768K
众所周知计算机代码底层计算都是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
 
解题思路:本题先计算每个字符串中0的数目,1的数目,题目为01背包问题
其中0的个数为n,1的个数为m
dp[jj][kk]表示jj个0,kk个1能构成的最多的字符串个数
dp[jj][kk] = max(dp[jj][kk],dp[jj-zero[ii]][kk-one[ii]]+1);
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 using namespace std;
 5 //统计  字符串中 0 和 1 的个数
 6 void count(string  s,vector<int> &zeros,vector<int> &ones,int i)
 7 {
 8     int numOf0 = 0,numOf1 = 0;
 9     for(int ii=s.size()-1;ii>=0;--ii)
10     {
11         if(s[ii] =='0')
12         {
13             ++numOf0;
14         }
15         else
16         {
17             ++numOf1;
18         }
19     }
20     zeros[i] = numOf0;
21     ones[i] = numOf1;
22 }
23 int main()
24 {
25     int x,n,m;
26     cin>>x>>n>>m;
27     vector<int>  zeros(20,0);
28     vector<int>  ones(20,0);
29     int dp[501][501] = {0};
30     string s;
31     for(int ii = 0;ii<x;ii++)
32     {
33         cin>>s;
34         count(s,zeros,ones,ii);
35     }
36     //动态规划  0-1背包问题
37     for(int ii = 0;ii<x;ii++)
38         for(int jj = n;jj>=zeros[ii];--jj)
39             for(int kk=m;kk>=ones[ii];--kk)
40             {
41                 dp[jj][kk] = max(dp[jj][kk],dp[jj- zeros[ii]][kk - ones[ii]]+1);
42             }
43     cout<<dp[n][m]<<endl;
44     return 0;
45 }
原文地址:https://www.cnblogs.com/qqky/p/7008813.html