多重背包
题目地址:http://codeforces.com/problemset/problem/148/E
背包问题,物品就是每一层,容量就是发火次数。
#include<iostream> using namespace std; int v[101][101],x[101],w[101][101],dp[101][10001]; int main() { int n,m; cin>>n>>m; //int i=3; for(int i = 1;i <= n;i++) { cin>>x[i]; for(int j = 1;j <= x[i];j++) { cin>>v[i][j]; v[i][j]+=v[i][j-1]; } } for(int i = 1;i <= n;i++) for(int j = 1;j <= x[i];j++) for(int k = 0;k <= j;k++)//暴力枚举在某个架子上扔n次的最大损失 w[i][j] = max(w[i][j],v[i][k]+v[i][x[i]]-v[i][x[i]-j+k]); for(int i = 1;i <= n;i++) for(int j = m;j >= 0;j--) for(int k = 0;k <= x[i]&&k <= j;k++) dp[i][j] = max(dp[i][j],dp[i-1][j-k]+w[i][k]); cout<<dp[n][m]; }
浙公网安备 33010602011771号