牛客第二次模拟第三题

看到很多人是爆搜,因此想和大家分享点我的经验
因为是一只OIer(现在是大学生er...)所以做这些题目很敏感😂
我的思路如下:(第三题100%过)

第三题是二位花费的背包问题,每件物品要花费0和1各x和y个,总共有n个0和m个1,问每件物品最多取一次,最多可以取多少物品,递归公式为a[j][k] = max(a[j-thing[i].x][k-thing[i].y,a[j][k]),其中thing[i].x为第i件物品消耗多少个x,thing[i].y为第i件物品消耗1的个数。
我的代码:(100%通过)

#include <iostream>

using namespace std ;


struct thing {

int x; // 需要 0 的个数

int y; // 需要 1 的个数

thing(){

x = 0 ;

y = 0 ;

}

};

int maxx( int x, int y)

{

if (x<y)

return y;

return x;

}

int main( int argc, const char * argv[]) {

int x,n,m;

cin >>x>>n>>m;

string s[ 55 ];

thing th[ 55 ];

int a[ 555 ][ 555 ];

for ( int i= 0 ;i<x;i++)
cin >>s[i];

for ( int i= 0 ;i<x;i++)

for ( int j= 0 ;j<s[i]. length ();j++)

{

if (s[i][ j ] == '0' )

th[i]. x ++;

else if (s[i][ j ] == '1' )

th[i]. y ++;

}


for ( int i= 0 ;i<=n;i++)

for ( int j= 0 ; j<=m;j++)

a[i][j]= 0 ; // 边界

int ans= 0 ;

for ( int i= 1 ;i<=x;i++)

for ( int j=n;j>=th[i- 1 ]. x ;j--)

for ( int k=m;k>=th[i- 1 ]. y ;k--)

{

a[j][k]= maxx (a[j][k],a[j-th[i- 1 ]. x ][k-th[i- 1 ]. y ]+ 1 );

if (a[j][k]>ans)

ans=a[j][k];

}

cout <<ans<< endl ;

return 0 ;
}

全部评论
棒~
点赞 回复 分享
发布于 2017-03-23 23:29
棒,双重背包
点赞 回复 分享
发布于 2017-03-23 23:50
实际上爆搜复杂度更低 只有2^20次方,还可以加剪枝,虽然我也是dp过得,还有为何你的i不直接从0开始呢?(逃
点赞 回复 分享
发布于 2017-03-24 00:00
摸oi爷,用爆搜是因为爆好写。。。好写。写
点赞 回复 分享
发布于 2017-03-24 00:02
int a[555][555]是怎么过得
点赞 回复 分享
发布于 2017-03-27 09:33

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务