题目:http://acm.hdu.edu.cn/showproblem.php?pid=1712
大意:
n节课,m天,后面第i节课上j天获得的好处。
背包九讲写道:
for 所有的组k
for v=V..0
for 所有的i属于组k
f[v]=max{f[v],f[v-c[i]]+w[i]}
注意这里的三层循环的顺序,甚至在本文的beta版中我自己都写错了。“for v=V..0”这一层循环必须在“for 所有的i属于组k”之外。这样才能保证每一组内的物品最多只有一个会被添加到背包中。
每种课为一组。
#include<bits/stdc++.h>
using namespace std;
const int inf=0x7ffffff;
int dp[105],c[105];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)&&(n+m)){
fill(dp,dp+105,0); //不用装满,不用上满m天课,最大化就行
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cin>>c[j];
for(int j=m;j>=1;j--)
for(int k=1;k<=j;k++) //必然是不能超过j
dp[j]=max(dp[j],dp[j-k]+c[k]);
}
cout<<dp[m]<<endl;
}
return 0;
}