RQNOJ--160 竞赛真理(01背包)
2013-12-04 20:53 gongti 阅读(260) 评论(0) 编辑 收藏 举报
题目http://www.rqnoj.cn/problem/160
分析:这是一个01背包问题,对于每一道题目,都有两个选择"做"或者"不做"。
但是唯一不同的是如果做,那么又有两种选择。因此多加了判断条件。
二维的动态转移方程是:
dp[i,j]=max{ dp[i-1,j], dp[i-1,j-c1[i]]+w1[i], dp[i-1,j-c2[i]]+w2[i] }
将二维降维到一维:
dp[j]=max{ dp[j], dp[j-c1[i]]+w1[i], dp[j-c2[i]]+w2[i] }
#include<stdio.h>
#include<string.h>
const int INF=0XFFFFFF;
int dp[1080010],T;
int getMax(int a,int b)
{
return a>b?a:b;
}
void ZeroOnePack(int c1,int t1,int c2,int t2)
{
for (int i=T;i>=0;i--)
{
if(i>=t1) dp[i]=getMax(dp[i],dp[i-t1]+c1);
if(i>=t2) dp[i]=getMax(dp[i],dp[i-t2]+c2);
}
}
int main()
{
int N,w1[32],t1[32],w2[32],t2[32];
while (scanf("%d%d",&N,&T)!=EOF)
{
for(int i=1;i<=N;i++)
scanf("%d%d%d%d",&w1[i],&t1[i],&w2[i],&t2[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
ZeroOnePack(w1[i],t1[i],w2[i],t2[i]);
printf("%d\n",dp[T]);
}
return 0;
}