首页 > 代码库 > 【hdu1712】分组背包(每组最多选1个)

【hdu1712】分组背包(每组最多选1个)

【分组背包】

技术分享

【题意】ACboy要开始选课了,上一门课能够获得的收益和他上这门课的时间是有关的,然后给你若干门课,让你帮他进行选课,
每一门课自然是只能选择一个课程时长,问你如何选择,才能使ACboy获得的受益最大。

 

for(k=1;k<=K;k++)
  for(int v=V;v>=0;v--)
    for(int i=item in group k)
      f[v]=max(f[v],f[v-c[i]+w[i]);
保证用到的都是k-1所更新的而不是k所更新的。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 
10 const int N=110;
11 int n,m,a[N][N],f[N];
12 
13 int maxx(int x,int y){return x>y ? x:y;}
14 
15 int main()
16 {
17     freopen("a.in","r",stdin);
18     while(1)
19     {
20         scanf("%d%d",&n,&m);
21         if(!n && !m) return 0;
22         for(int i=1;i<=n;i++)
23             for(int j=1;j<=m;j++)
24             {
25                 scanf("%d",&a[i][j]);
26             }
27         memset(f,0,sizeof(f));
28         for(int i=1;i<=n;i++)
29             for(int j=m;j>=1;j--)
30                 for(int k=1;k<=j;k++)
31                 {
32                     f[j]=maxx(f[j],f[j-k]+a[i][k]);
33                 }
34         printf("%d\n",f[m]);
35     }
36     return 0;
37 }

 

【hdu1712】分组背包(每组最多选1个)