题目链接
https://cn.vjudge.net/problem/HDU-1712
有n门课程,m天,
给出val[i][j]表示用j天复习i门课程得到val[i][j]的价值,求一个最大价值
分组背包 : N 件物品和V ,第 i 件物品的费用是 c [ i ],价值是 w [ i ]。
这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。
分组背包要保证每组里面的物品不同时取,这个可以通过改变枚举物品顺序做到,分三重枚举,
第一重枚举第几组,第二重枚举背包容量,要倒着来,第三重枚举该组里面的物
一维
for(int i=1;i<=n;++i){
for(int j=m;j>=1;--j){
for(int k=1;k<=j;++k){
dp[j]=max(dp[j],dp[j-k]+val[i][k]);
}
}
}
问题转化:m天相当于容量V
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int val[101][101],dp[101];
//给出val[i][j]表示用j天复习i门课程得到val[i][j]的价值
int main(){
int n,V;
while(cin>>n>>V&&n!=0&&V!=0){
memset(val,0,sizeof(val));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i){
for(int j=1;j<=V;++j){
cin>>val[i][j];
}
}
for(int i=1;i<=n;++i){//n门课程 第i门课程 (组)
for(int j=V;j>=1;--j){// m天 背包容量 逆序 最终1天
for(int k=1;k<=j;++k){//第i组的物品
dp[j]=max(dp[j],dp[j-k]+val[i][k]);
}
}
}
cout<<dp[V]<<endl;
}
return 0;
}