您的位置:首页 > 其它

HDU 3496 Watch The Movie【二维费用的0/1背包问题】

2013-08-03 09:43 501 查看
思路:

要注意的几点:

(1)必须要在N种动漫里面选择M种,所以初始化时dp[L][M]时,除当m=0,dp[L][M]=0外,其他的初始化为负的无穷大;(见背包九讲关于初始化得方法)

(2)最后输出时要满足dp[L][M]不小于0,因为当dp[L][M]<0时,表明不可能在N种动漫里面选择M种(无法完全满足),也是题意:“If DuoDuo can’t watch all of the movies that her uncle had bought for her, please output 0”

AC代码:

#include<stdio.h>
#include<string.h>
#define inf 0x3f3f3f3f
long dp[1005][105],c[105],w[105];
int L,M;
void Bi_ZeroOnePack(int c,int w)
{
int m,l;
for(l=L;l>=c;l--)
for(m=M;m>=1;m--)
if(dp[l][m]<dp[l-c][m-1]+w)
dp[l][m]=dp[l-c][m-1]+w;
}
int main()
{
int n;
int i;
int T;
int l,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&M,&L);
for(i=1;i<=n;i++)
scanf("%ld%ld",&c[i],&w[i]);
for(l=0;l<=L;l++)
for(m=0;m<=M;m++)
if(m==0)dp[l][m]=0;
else dp[l][m]=-inf;
for(i=1;i<=n;i++)
Bi_ZeroOnePack(c[i],w[i]);
if(dp[L][M]<0)dp[L][M]=0;/*表示不能看完所有的电影,也就是不能精确满足M的个数*/
printf("%ld\n",dp[L][M]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: