zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    Mac电脑kernel_task占用内存过高
    Mac上的聚焦搜索无法查找到应用
    Mac电脑变卡的原因:
    IE浏览器整页截屏程序
    拓扑排序算法的一个应用
    简单演示mySQL后端数据库关系信息逆向加入到PowerDesigner的物理数据模型和概念数据模型中
    解密存储过程或函数
    C#画图
    .NET设计模式开篇
    非重复随机序列生成算法
  • 原文地址:https://www.cnblogs.com/charlotte-o/p/7473340.html
Copyright © 2011-2022 走看看