您的位置:首页 > 其它

hdu5000 背包dp

2015-09-01 17:11 465 查看
题意可抽象为:N个包中每个包容量是T[i],每个包都拿一些,设拿出的总数为sum时的方案数为q,求max(q)

设dp[i][j]为拿了前i个包,共拿出了j物品时的方案数。那么

for i=1 to n

  for j=0 to sum

    for k=0 to t[i]

      dp[i][j]+=dp[i-1][j-k]

但是注意这题中间过程就得取MOD,然而这题求的却是最大值取模而不是取模之后的最大值  【这俩并不一样

可以打表得知dp
[sum{T[i]}/2]是最大值

#include <iostream>
#include<cstring>
#define MOD 1000000007
#define LL long long
using namespace std;
int N,T;
LL sum;
int t[2010];
int dp[2010][2010];

int main()
{
cin>>T;
while(T--)
{
memset(dp,0,sizeof(dp));
sum=0;

cin>>N;
for(int i=1;i<=N;i++)
{
cin>>t[i];
sum+=t[i];
}

//cout<<sum<<endl;
sum=sum/2;
//cout<<sum<<endl;

for(int i=0;i<=t[1];i++)
dp[1][i]=1;

for(int i=2;i<=N;i++)
for(int j=0;j<=sum;j++)
for(int k=0;k<=t[i];k++)
if(j>=k)
{
//cout<<i%2<<" "<<(i-1)%2<<endl;
dp[i][j]+=dp[i-1][j-k];         //dp[i][j]+=dp[i-1][j-k]
dp[i][j]=dp[i][j]%MOD;
}

cout<<dp
[sum]<<endl;
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: