1.题目描述
描述
给定一个集合S,共有k元素,集合的每个元素是由0和1组成的串。
现要求从中选出一些串,形成新的集合S1。这个新集合S1需要满足这样的条件:它所有串中0的个数之和不超过m,1的个数之和不超过n。
问你S1的元素个数最多是多少。
提示:从S中选择串放到S1中时,一个串只能选一次。
输入
第一行包含四个整数,k、r、m、n。k表示S中元素个数,r表示最长01串的长度,m表示0的个数的上限,n表示1的个数的上限。
后面后k行,每一行是一个01串。
输出
S1中最多包含S中的多少个01串。
样例
输入
5 6 5 3 10 0001 111001 1 0
输出 4
输入
3 2 1 1 10 1 0
输出 2
提示
对于30%的数据,保证有k<=20,r<=20,m<=100,n<=100;
对于60%的数据,保证有k<=300,r<=50,m<=500,n<=500;
对于全部的数据,保证有k<=1000,r<=100,m<=2000,n<=2000.
2.已写了代码,但是运行不成功,想麻烦各位帮帮忙,看看哪里有问题
代码如下:
#include<iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char str[1001][100];
int f[2][2002][2002];
int w0[2002],w1[2002];
int count[1001];
int main()
{
int g,r,m,n,i,j,k;
cin>>g >>r>>m>>n;
for(i=0;i<g;i++)
{gets(str[i]);count[i]=strlen(str[i]);}
for(int row =0;row<g;row++)
{
for(int col=0;col<count[row];col++ )
{
if(str[row][col]=='0'){
w0[row]++;
}else if(str[row][col]=='1'){
w1[row]++;
}
}
}
for ( int i = 0; i <= g; i++) {
int newl=i%2;
int oldl=(i-1)%2;
for ( int j = 0; j <= m; j++) {
for (int k = 0; k <= n; k++) {
if(i==0 || j==0 || k==0) f[newl][j][k]=0;
if (j < w0[i] || k < w1[i]) f[newl][j][k] = f[oldl][j][k];
else {
f[newl][j][k] = max(f[oldl][j][k], f[oldl][j - w0[i]][k - w1[i]] + 1);
cout << f[oldl][j][k]<<" " <<f[oldl][j-w0[i]][k-w1[i]]<< endl;
}
cout <<i<< " "<< j<<" " <<k<< " "<<f[i][j][k] << endl;
}
}
}
cout<<f[g%2][m][n];
return 0;
}
使用的软件是DEV C++
把你运行不成功的具体现象描述仔细一些
是这题吗
https://leetcode-cn.com/problems/ones-and-zeroes/
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y
参考一下https://blog.csdn.net/it_xiangqiang/article/details/114734534,望采纳,不懂的可以关注私信我。