HDU-1712-ACboy needs your help

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1712

 

题意

给你一个n*m的矩阵,行代表第i门课程,列代表修这门课程要花的时间天数,矩阵值代表得到的效益。

做这题,刚好在看分组背包,直接用分组背包A了,一个分组背包的裸题,

何谓分组背包:转自背包九讲

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]}


代码

/*for 所有的组k
for v=V..0
for 所有的i属于组k
f[v]=max{f[v],f[v-c[i]]+w[i]}

*/

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;


int main(void)
{
int i,j,k,n,m;
int matrix[110][110];
int f[110];
while(scanf("%d%d",&n,&m)==2&&(n+m))
{
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&matrix[i][j]);
}
}
for(i=1;i<=n;i++)
{
for(j=m;j>=0;j--)
{
for(k=1;k<=m&&k<=j;k++)
{
f[j]=max(f[j],f[j-k]+matrix[i][k]);
//printf("%d\n",f[j]);
}
}
}
printf("%d\n",f[m]);
}
return 0;
}




posted @ 2014-12-03 13:05  立刻行动  阅读(135)  评论(0编辑  收藏  举报