HDU 5234 Happy birthday 01背包

时间:2023-03-09 09:48:55
HDU 5234 Happy birthday 01背包

题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5234

bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=585&pid=1003

题解:

由于数据比较小,所以可以转化为判定性问题,即:

  dp[i][j][kk]表示走到i,j这一点时吃了kk重的蛋糕,转移方程只要考虑这一点的蛋糕吃和不吃两种情况(01背包)

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int maxn=; bool dp[maxn][maxn][maxn];
int arr[maxn][maxn];
int n,m,kilo; void init(){
memset(dp,,sizeof(dp));
for(int i=;i<maxn;i++){
for(int j=;j<maxn;j++){
dp[i][j][]=;
}
}
} int main(){
while(scanf("%d%d%d",&n,&m,&kilo)==&&n){
init();
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&arr[i][j]);
}
} for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=;k<=kilo;k++){
//(i,j)这点的蛋糕不吃
dp[i][j][k]=dp[i-][j][k]|dp[i][j-][k];
//(i,j)吃这点的蛋糕
if(k>=arr[i][j]){
dp[i][j][k]|=dp[i-][j][k-arr[i][j]];
dp[i][j][k]|=dp[i][j-][k-arr[i][j]];
}
}
}
} int ans=;
for(int i=kilo;i>=;i--){
if(dp[n][m][i]){
ans=i; break;
}
}
printf("%d\n",ans);
}
return ;
}