zoukankan      html  css  js  c++  java
  • hdu 1712 ACboy needs your help 分组背包

    题目 :

    Problem 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

    多组背包 :每组中的物品至多选一个

    二维代码 :( 用原来的那个数组直接更新 )

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 int main( ){
     6 
     7     int n,m,dp[105][105]={0},Max;
     8     while(1) {
     9 
    10         cin >>n >>m;
    11         if( n==0 && m==0 ) break;
    12         for( int i=1;i<=n;i++)
    13             for( int j=1;j<=m;j++)
    14                 cin >>dp[i][j];
    15 
    16         for( int i=2;i<=n;i++) {
    17             for( int j=m;j>=1;j--){
    18                 Max=dp[i][j];
    19                 //  对 第i行第j行 位置更新 
    20                 //  因为dp[i-1][j-k] 是 第i-1行第j-k行 位置 的最优解 ,所以对于 一个dp[i][k] 应该对应的 + dp[i-1][j-k],得一个较大值。
    21                 for( int k=1;k<j;k++)   
    22                     Max=max( Max, dp[i-1][j-k]+dp[i][k] );
    23                 dp[i][j]=max( Max, dp[i-1][j] ) ;
    24             }
    25         }
    26         Max=-1;
    27 
    28         for( int i=1;i<=m;i++)
    29             Max=max( Max, dp[n][i] );
    30         cout <<Max <<endl;
    31     }
    32 }
    View Code

    一维数组 :

     1 #include<iostream>
     2 #include<cstring>
     3 
     4 using namespace std;
     5 
     6 int main( ){
     7 
     8     int n,m,V[105][105]={0},dp[105];
     9     while(1) {
    10 
    11         cin >>n >>m;
    12         if( n==0 && m==0 ) break;
    13         memset (dp,0,sizeof(dp));
    14 
    15         for( int i=1;i<=n;i++)
    16             for( int j=1;j<=m;j++)
    17                 cin >>V[i][j];
    18 
    19         for( int i=1;i<=n;i++)
    20             for( int j=m;j>=1;j--)
    21                 for( int k=0;k<=j;k++)
    22                     dp[j]=max( dp[j], dp[j-k]+V[i][k] );
    23         for( int i=1;i<=m;i++)
    24            dp[0]=max( dp[0],dp[i] );
    25 
    26         cout <<dp[0] <<endl;
    27     }
    28 }
    View Code
  • 相关阅读:
    HashMap深度解析(二)(转)
    HashMap深度解析(一)(转)
    GeoHash核心原理解析(转)
    spring boot 策略模式实践
    Java中CAS详解(转)
    springMVC请求流程详解(转)
    7 vi 编辑器
    Linux 命令行快捷键
    Java
    3 Eclipse 查看不了源码
  • 原文地址:https://www.cnblogs.com/lysr--tlp/p/tl.html
Copyright © 2011-2022 走看看