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.
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
之前没有专门看过分组背包的讲解,这是第一个代码,我自己想的。
看了讲解才知道可以优化成一维。在后面。
修改前:
#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
- hdu 1712 ACboy needs your help 分组背包
- hdu 1712 ACboy needs your help(分组背包入门题)
- HDU 1712 ACboy needs your help(分组背包)
- 【hdu 1712】ACboy needs your help (分组背包)
- hdu 1712 ACboy needs your help (分组背包)
- hdu 1712 ACboy needs your help(分组背包)
- hdu 1712 ACboy needs your help(分组背包)
- HDU 1712 ACboy needs your help ----分组背包
- hdu 1712 ACboy needs your help (分组背包)
- hdu 1712 ACboy needs your help(分组背包)
- HDU 1712 ACboy needs your help(DP 分组背包)
- hdu 1712 ACboy needs your help (分组背包)
- hdu 1712 ACboy needs your help(分组背包)
- hdu 1712ACboy needs your help 01背包(分组)
- HDU 1712 ACboy needs your help (分组背包)
- hdu 1712 ACboy needs your help (分组背包)
- hdu 1712 ACboy needs your help (分组背包)
- HDU 1712 ACboy needs your help 分组背包
- poj3984迷宫问题(bfs)
- 卓识成就教育获得500万美金融资 成为资本投资
- Ignatius's puzzle
- Android:ViewPager 随记一
- Json数据格式介绍、使用Android自带类库完成Json生成与解析
- hdu 1712 ACboy needs your help 分组背包
- Ukulele爬格子 备忘
- Java代码性能优化
- linux处理邮件编码
- POJ 3211 —— Washing Clothes 01背包
- 01java语法回顾_常用api类
- SEO优化-伪静态-URLRewrite 详解
- 给定权值 {19,01,23,14,55,20,84,27 },构造相应的哈夫曼树,计算WPL.
- iOS开发之SDWebImage