hdu1712分组背包
2016-05-17 20:25
253 查看
B - ACboy needs your help
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status
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
题意:学生A,有n科考试,m天复习时间,然后有一个n*m的矩阵,a[i][j]表示第i科考试用j天复习得到的效益值,求最大效益值
,显然每一科只能选择确定天数去复习;
这便是分组背包了:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
算法
这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:
f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}
使用一维数组的伪代码如下:
for 所有的组k
for
v=V..0
for 所有的i属于组k
f[v]=max{f[v],f[v-c[i]]+w[i]}
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status
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
题意:学生A,有n科考试,m天复习时间,然后有一个n*m的矩阵,a[i][j]表示第i科考试用j天复习得到的效益值,求最大效益值
,显然每一科只能选择确定天数去复习;
这便是分组背包了:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
算法
这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:
f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}
使用一维数组的伪代码如下:
for 所有的组k
for
v=V..0
for 所有的i属于组k
f[v]=max{f[v],f[v-c[i]]+w[i]}
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int max(int a,int b) { if(a>b) return a; return b; } const int maxn=10100,inf=0x3f3f3f3f; int dp[maxn],a[105][105]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=m;j>=1;j--) { for(int k=1;k<=m;k++) { if(j-k>=0) dp[j]=max(dp[ } }j],dp[j-k]+a[i][k]); } printf("%d\n",dp[m]); } return 0; }
相关文章推荐
- PPT打不开提示访问出错怎么办
- 机器学习/深度学习/自然语言处理学习路线
- [计服15] 5.18实验
- DbUtils
- 定义职工类Employee对象数组,内放5个职工的数据(编号、姓名、性别、月薪),建立函数输出职工信息表。
- 【java】位运算
- NSCharacterSet 简单用法
- HDU 5687 Problem C
- lunbo
- 第一个只出现一次的字符相关问题
- Power of two,power of three,power of four
- centos安装confluence全攻略
- Linux服务器压测
- 三个重要的同余式——威尔逊定理、费马小定理、欧拉定理 + 求幂大法的证明
- Jupyter Notebook 的快捷键
- 使用Spring MVC写RESTFUL API
- xtrabackup备份执行报错一例
- 表单验证插件Validate.js的使用
- 作业8
- Linux服务器压测