您的位置:首页 > 其它

hdu 1712 ACboy needs your help(分组背包)

2018-03-17 16:19 399 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 1712 ACboy needs your help