hdu 1712 ACboy needs your help 分组背包

来源:互联网 发布:苹果的电子相册软件 编辑:程序博客网 时间:2024/05/21 19:49


ACboy needs your help

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


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 21 21 32 22 12 12 33 2 13 2 10 0
 

Sample Output
346
 

Source
HDU 2007-Spring Programming Contest
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  2159 1561 2602 3033 1203 
 

Statistic | Submit | Discuss | Note

之前没有专门看过分组背包的讲解,这是第一个代码,我自己想的。

看了讲解才知道可以优化成一维。在后面。


修改前:

#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<climits>#include<queue>#include<vector>#include<map>#include<sstream>#include<set>#include<stack>#include<cctype>#include<utility>#pragma comment(linker, "/STACK:102400000,102400000")#define PI (4.0*atan(1.0))#define eps 1e-10#define sqr(x) ((x)*(x))#define FOR0(i,n)  for(int i=0 ;i<(n) ;i++)#define FOR1(i,n)  for(int i=1 ;i<=(n) ;i++)#define FORD(i,n)  for(int i=(n) ;i>=0 ;i--)#define  lson   ind<<1,le,mid#define rson    ind<<1|1,mid+1,ri#define MID   int mid=(le+ri)>>1#define zero(x)((x>0? x:-x)<1e-15)#define mk    make_pair#define _f     first#define _s     secondusing namespace std;//const int INF=    ;typedef long long ll;//const ll inf =1000000000000000;//1e15;//ifstream fin("input.txt");//ofstream fout("output.txt");//fin.close();//fout.close();//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);const int INF =0x3f3f3f3f;const int maxn=  100+10 ;const int maxm=  100+10  ;//const int maxm=    ;int n,V;ll val[maxn][maxm];ll dp[maxn][maxm];int main(){    while(~scanf("%d%d",&n,&V)&&(n||V) )    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=V;j++)            {                scanf("%lld",&val[i][j]);            }        }        memset(dp,0,sizeof dp);        for(int i=1;i<=n;i++)        {            for(int v=0;v<=V;v++)  dp[i][v]=dp[i-1][v];            //如果二维的,根据dp的意义,如果是某体积背包(不一定装满)最大价值一般来说要继承上一阶段的。            //还可理解为是某种决策-----该组可以不选(任何一个物品),但这里也必须继承。            for(int cost=1;cost<=V;cost++)            {                for(int v=V;v>=cost;v--)                {                    dp[i][v]=max(dp[i][v],dp[i-1][v-cost]+val[i][cost]);                }            }        }        printf("%lld\n",dp[n][V]);    }    return 0;}





修改后:

#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<climits>#include<queue>#include<vector>#include<map>#include<sstream>#include<set>#include<stack>#include<cctype>#include<utility>#pragma comment(linker, "/STACK:102400000,102400000")#define PI (4.0*atan(1.0))#define eps 1e-10#define sqr(x) ((x)*(x))#define FOR0(i,n)  for(int i=0 ;i<(n) ;i++)#define FOR1(i,n)  for(int i=1 ;i<=(n) ;i++)#define FORD(i,n)  for(int i=(n) ;i>=0 ;i--)#define  lson   ind<<1,le,mid#define rson    ind<<1|1,mid+1,ri#define MID   int mid=(le+ri)>>1#define zero(x)((x>0? x:-x)<1e-15)#define mk    make_pair#define _f     first#define _s     secondusing namespace std;//const int INF=    ;typedef long long ll;//const ll inf =1000000000000000;//1e15;//ifstream fin("input.txt");//ofstream fout("output.txt");//fin.close();//fout.close();//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);const int INF =0x3f3f3f3f;const int maxn=  100+10 ;const int maxm=  100+10  ;//const int maxm=    ;int n,V;ll val[maxn][maxm];ll dp [maxm];int main(){    while(~scanf("%d%d",&n,&V)&&(n||V) )    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=V;j++)            {                scanf("%lld",&val[i][j]);            }        }        memset(dp,0,sizeof dp);        for(int i=1;i<=n;i++)        {             for(int v=V;v>=0;v--)            {                for(int cost=1;cost<=V;cost++)                {                    if(v<cost)  continue;                    dp[v]=max(dp[v],dp[v-cost]+val[i][cost]);                }            }        }        printf("%lld\n",dp[V]);    }    return 0;}



0 0
原创粉丝点击