题意
传送门:HDU
N N N 门课程, M M M 天,每门课程上 1... M 1...M 1...M 天都有不同的价值,求最高价值。
思路
分组背包模板题。
设 d p [ i ] [ j ] dp[i][j] dp[i][j] 为前 i i i 门课上 j j j 天的最大价值,则动态转移方程为:
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w [ i ] [ k ] ] + c [ i ] [ k ] ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i][k]]+c[i][k]) dp[i][j]=max(dp[i−1][j],dp[i−1][j−w[i][k]]+c[i][k])
滚动数组优化即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m;
int dp[N],c[N][N],w[N][N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
while(cin>>n>>m && n && m) { // 多组测试点
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin>>c[i][j]; // 注意输入的存储
w[i][j] = j;
}
}
for(int i=1;i<=n;i++) {
for(int j=m;j>=0;j--) {
for(int k=1;k<=m;k++) {
if(j >= w[i][k]) dp[j] = max(dp[j],dp[j-w[i][k]] + c[i][k]); // 转移方程
}
}
}
cout<<dp[m]<<endl;;
}
return 0;
}