[编程题] 创造新世界
时间限制: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 }