zoukankan      html  css  js  c++  java
  • HDU 1712 分组背包

    ACboy needs your help

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4912    Accepted Submission(s): 2651


    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
     
    Source
     
     
    题目意思:
    有n个课程,每个课程在不同天数得到不同价值,总共m天,问m天之内得到最大的价值。
     
    思路:
    每个课程若在i天完成,就不能在j天完成。以n个课程为组,天数为体积,价值为价值,即得到分组背包的模型。
     
    dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[k]]+w[k])//dp[i][j]表示前i组已占用j体积时最大价值。
     
    代码:
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <vector>
     6 #include <queue>
     7 #include <cmath>
     8 #include <set>
     9 using namespace std;
    10 
    11 #define N 105
    12 
    13 int max(int x,int y){return x>y?x:y;}
    14 int min(int x,int y){return x<y?x:y;}
    15 int abs(int x,int y){return x<0?-x:x;}
    16 
    17 
    18 int a[N][N];
    19 int n, m;
    20 int dp[N];
    21 
    22 main()
    23 {
    24     int i, j, k;
    25     while(scanf("%d %d",&n,&m)==2){
    26         if(!n&&!m) break;
    27         for(i=1;i<=n;i++){
    28             for(j=1;j<=m;j++)
    29                 scanf("%d",&a[i][j]);
    30         }
    31         memset(dp,0,sizeof(dp));
    32         for(i=1;i<=n;i++){
    33             for(j=m;j>=0;j--){
    34                 for(k=1;k<=j;k++){
    35                     dp[j]=max(dp[j],dp[j-k]+a[i][k]);
    36                 }
    37             }
    38         }
    39         printf("%d
    ",dp[m]);
    40     }
    41 }
  • 相关阅读:
    弄懂JDK、JRE和JVM到底是什么
    精选Java面试题(二)
    精选Java面试题
    HttpPost请求将json作为请求体传入的简单处理方法
    Python在for循环中更改list值的方法
    vue 图片加载失败时,加载默认图片
    移动端,进入页面前空白,添加加载状态
    img 失效时 显示默认图片
    vue 全局组件的引用
    页面到达底部,加载更多
  • 原文地址:https://www.cnblogs.com/qq1012662902/p/4654697.html
Copyright © 2011-2022 走看看