第三题是二位花费的背包问题,每件物品要花费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 ; }
点赞 评论

相关推荐

01-14 15:08
东南大学 Java
点赞 评论 收藏
分享
浪子陪都:简历最优秀的地方放到了后面,国奖,校级奖学金这些是最亮眼的。说明你跟同级别的学生不一样。 建议台灯这个,PCB布局布线这个词汇不专业,业内是PCB Layout,第二,单片机的板子一般不用考虑SI,PI 都是低速信号,只要遵循3W原则就好了。 单片机的项目太low了,技能这块,你要看一下BOSS直聘的招聘要求,按照别人的要求写,一些关键词可以增加你简历被检索到的概率。 主修课程不用写,这个没有人去关注的。
点赞 评论 收藏
分享

牛客热帖

更多
牛客网
牛客企业服务