背景:1Y,01背包多加了一个挑选循环而已。
分组背包的典型描述:对于很多背包,把它分为k个组,每个组内的组员是相互冲突的,所以只能选择一个。
我的代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main(void){
int n,m;
while(scanf("%d%d",&n,&m),n*n+m*m){
int c[n][m],F[101];
memset(F,0,sizeof(F));
for(int i=0;i < n;i++)
for(int j=0;j < m;j++)
scanf("%d",&c[i][j]);
for(int i=0;i < n;i++){
for(int j=m;j >= 1;j--){
for(int k=0;k < m;k++){
if(k+1 <= j) F[j]=max(F[j],F[j-k-1]+c[i][k]);
}
}
}
printf("%d\n",F[m]);
}
return 0;
}