HDU 1712 裸分组dp
http://acm.hdu.edu.cn/showproblem.php?pid=1712
N门课M天复习,第i门课花费j天获得的效益是dp[i][j]
求最大效益
分组背包,同一门课不能选两次
三层循环
第一层:几个分组循环
第二层:总容量递减
第三层:抉择构成背包
dp[j]=max(dp[j],dp[j-c[k]]+w[k]);(其中c[k]为k物品的费用,w[k]为价值),由于递降枚举背包容量,max比较中的dp[j]是由上一组物品决策所得,在这里将被忽略。就算不忽略,在本组物品中dp[j]的决策依然要取决于dp[j-c[k]]+w[k]。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[105][105],m,n,f[105]; int max(int a,int b) { if(a>=b){return a;} return b; } void rec() { memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { for(int j=m;j>=0;j--) { for(int k=1;k<=j;k++) { f[j]=max(f[j],f[j-k]+dp[i][k]); } } } cout<<f[m]<<endl; } int main() { int i,j; while(cin>>n>>m&&n&&m) { for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>dp[i][j]; } } rec(); memset(dp,0,sizeof(dp)); } return 0; }