• hdu-1712 ACboy needs your help


    ACboy needs your help

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

    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
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  2159 1561 2602 3033 2955 
     
    题解:
    分组背包问题:

    for 所有的组k

        for v=V..0

            for 所有的i属于组k

                f[v]=max{f[v],f[v-c[i]]+w[i]}

    注意循环的顺序,v在i里面,保证每组最多只有一个物品被选

    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    int f[110],w[110][110];
    int get()
    {
    	int ans=0,f=1;char ch=getchar();
    	while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    	while(isdigit(ch)) {ans=ans*10+ch-'0';ch=getchar();}
    	return ans*f;
    }
    void init(int m)
    {
    	fill(f,f+m+1,0);
    }
    int main()
    {
    	int n,m;
    	while(1)
    	{
    		n=get();m=get();
    		if(n==0&&m==0)
    		  return 0;
    		for(int i=1;i<=n;i++)
    		  for(int j=1;j<=m;j++)
    		    w[i][j]=get();
    		init(m);
    		for(int i=1;i<=n;i++)
    		  for(int j=m;j>=0;j--)
    		    for(int k=0;k<=j;k++)
    		      f[j]=max(f[j],f[j-k]+w[i][k]);
    		printf("%d
    ",f[m]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    巧用boost库实现字符串映射消息处理函数
    Apache Continuum 1.3.6 GA 发布下载
    NetBeans 时事通讯(刊号 # 98 Apr 08, 2010)
    source insight
    vim 树形目录插件NERDTree安装及简单用法 心灵净土 博客频道 CSDN.NET
    Janus: Vim Distribution
    vim中的复制与粘贴 | WangYan BLog
    ctagsrevised
    vi的复制粘贴命令_简简单单_百度空间
    贴个自个用的vimrc zmlovelx(帅得不敢出门 c/c++群31843264) 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/charlotte-o/p/7473340.html
Copyright © 2020-2023  润新知