您的位置:首页 > 其它

hdu 1712(分组背包)

2014-05-26 17:55 134 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712

思路:这是一道简单的分组背包,因为每种课可以有多种选择:花几天时间在该课上。一旦作出选择,就不能再选该课,就相当于有多组物品,每组内的物品互相冲突,最多只能选一件。

伪码:

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





View
Code

1 #include<iostream>
2 const int MAXN=110;
3 using namespace std;
4 int dp[MAXN];
5 int map[MAXN][MAXN];
6
7 int main(){
8     int n,m;
9     while(~scanf("%d%d",&n,&m)){
10         if(n==0&&m==0)break;
11         for(int i=1;i<=n;i++){
12             for(int j=1;j<=m;j++){
13                 scanf("%d",&map[i][j]);
14             }
15         }
16         memset(dp,0,sizeof(dp));
17         for(int i=1;i<=n;i++){
18             for(int j=m;j>=1;j--){
19                 for(int k=1;k<=m;k++){
20                     if(j-k>=0){
21                         dp[j]=max(dp[j],dp[j-k]+map[i][k]);
22                     }
23                 }
24             }
25         }
26         printf("%d\n",dp[m]);
27     }
28     return 0;
29
30 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: