• B


    B - ACboy needs your help
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    Description

    ACboy has N courses this term, and he plans to spend at most M days on study.Of course,the profit he will gain from different course depending on the days he spend on it.How to arrange the M days for the N courses to maximize the profit?
     

    Input

    The input consists of multiple data sets. A data set starts with a line containing two positive integers N and M, N is the number of courses, M is the days ACboy has.
    Next follow a matrix A[i][j], (1<=i<=N<=100,1<=j<=M<=100).A[i][j] indicates if ACboy spend j days on ith course he will get profit of value A[i][j].
    N = 0 and M = 0 ends the input.
     

    Output

    For each data set, your program should output a line which contains the number of the max profit ACboy will gain.
     

    Sample Input

    2 2 1 2 1 3 2 2 2 1 2 1 2 3 3 2 1 3 2 1 0 0
     

    Sample Output

    3
    4
    6
    题意:

    ACboyn门课可以参加,他有m天时间。一天只能参加一门课。一门课可以参加多天,参加的天数不同获得的经验不一样,并且一门课只能修习一次。但是要注意的是,同一门课不是参加的天数越多,经验就越高。输入的表示是,行数表示第几门课,列数表示上几天,该数就是第几门课参加几天获得的经验数。问m天能获得最多的经验数。

    思路:分组背包,建立dp数组dp[i][j]表示修习前i种课程,修习了j天,所得的最大的经验值。

    二维数组:

    方法:状态转移方程为dp[i][j]=max{dp[i-1][j],dp[i-1][j-k]+xing[i][k]},意思是前i-1种课程,前j-k天获得的经验最大数是dp[i-1][j-k],后k天参加第i门课获得的经验是xing[i][k]。比较此时的dp[i][j]和dp[i-1][j-k]+xing[i][k]谁大。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 
     6 using namespace std;
     7 
     8 
     9 int dp[103][103]={0};
    10 int xing[103][103]={0};
    11 
    12 
    13 int main()
    14 {
    15 //    freopen("1.txt","r",stdin);
    16     int n,m;
    17     while(cin>>n>>m&&n!=0&&m!=0){
    18         memset(dp,0,sizeof(dp));
    19         int i,j,k;
    20         for(i=1;i<=n;i++){//输入数据
    21             for(j=1;j<=m;j++)
    22                 cin>>xing[i][j];
    23         }
    24         for(i=1;i<=n;i++){
    25             for(j=1;j<=m;j++)
    26             for(k=0;k<=j;k++){
    27                 if(dp[i][j]<=dp[i-1][j-k]+xing[i][k])//进行比较
    28                     dp[i][j]=dp[i-1][j-k]+xing[i][k];//状态转移
    29             }
    30         }
    31         cout<<dp[n][m]<<endl;
    32     }
    33     return 0;
    34 }
    View Code

    一位数组:

    方法:状态转移方程为dp[j]=max{dp[[j],dp[j-k]+xing[i][k]},意思是前j-k天获得的经验最大数是dp[j-k],后k天参加第i门课获得的经验是xing[i][k]。比较此时的dp[j]和dp[j-k]+xing[i][k]谁大。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 
     6 using namespace std;
     7 
     8 
     9 int dp[103]={0};
    10 int xing[103][103]={0};
    11 
    12 
    13 int main()
    14 {
    15 //    freopen("1.txt","r",stdin);
    16     int n,m;
    17     while(cin>>n>>m&&n!=0&&m!=0){
    18         memset(dp,0,sizeof(dp));
    19         int i,j,k;
    20         for(i=1;i<=n;i++){
    21             for(j=1;j<=m;j++)
    22                 cin>>xing[i][j];
    23         }
    24         for(i=1;i<=n;i++){
    25             for(j=m;j>=1;j--)
    26             for(k=0;k<=j;k++){
    27                 if(dp[j]<=dp[j-k]+xing[i][k])
    28                     dp[j]=dp[j-k]+xing[i][k];
    29             }
    30         }
    31         cout<<dp[m]<<endl;
    32     }
    33     return 0;
    34 }
    View Code
  • 相关阅读:
    求凸包 cogs896
    oc中的正则表达式基本语法(一)
    oc中数据库使用详细解释(二)
    oc中数据库使用详细解释(一)
    NSSearchPathForDirectoriesInDomains函数详解
    通讯录.数据来自字典
    类似新闻客户端.UIPageControl和UIScroll的结合使用,滑点控制图片页码.显示图片页码
    关于target...action中的一点体会
    一些比较给力的IOS学习网址推荐
    点击return收回键盘(不用inputview)
  • 原文地址:https://www.cnblogs.com/zhangchengbing/p/3353409.html
Copyright © 2020-2023  润新知