【分组背包】
【题意】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 }
时间: 2024-10-13 00:29:22