嗯,一道纯裸的分组背包问题。。。。
题意是:有N个课程,然后选择M天内学习的效益最大值。
嗯,看第一版背包九讲的时候,也许会发现伪代码和我写的程序不一样,很正常,因为DD童鞋不小心写错了!
使用一维数组的伪代码如下:
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<stdlib.h>
#define Max(a,b) a>b? a:b
#define NN 10010
int mat[105][105];
int dp[NN];
int n,m;
int main()
{
int i,j,v;
while(scanf("%d%d",&n,&m),n+m){
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",&mat[i][j]);
}
}
for(i=1;i<=n;i++){ //分组
for(v = m ;v >= 1;v--){ //背包容量
for(j = 1 ;j<=m;j++){//不同时间的课程
if(v>=j)
dp[v] = Max(dp[v] ,dp[v-j]+mat[i][j]);
}
}
}
printf("%d\n",dp[m]);
memset(dp,0,sizeof(dp));
}
return 0;
}