HDU 5800 To My Girlfriend(dp)

169人阅读 评论(0) 收藏 举报
分类:

Description
给定n个物品,每个物品有一个价值ai,给出s,求这里写图片描述
其中f(i,j,l,k,m)表示从这n个物品中选取总价值为m的物品,其中有i物品j物品但没有j物品没有k物品的方案数
Input
第一行为一整数T表示用例组数,每组用例第一行两个整数n和s,之后n个整数表示每个物品的价值ai(T<=15,4<=n<=1000,1<=s<=1000,1<=ai<=1000)
Output
对于每组用例,输出这里写图片描述的值,结果模1e9+7
Sample Input
2
4 4
1 2 3 4
4 4
1 2 3 4
Sample Output
8
8
Solution
一个物品有四种状态,选,不选,必选,必不选,根据这个转移,令dp[i][j][s1][s2]表示从前i件物品中选取总价值为j,且已经有s1件物品必选,s2件物品必不选的方案数,那么有以下转移方程
dp[i][j][s1][s2]+=dp[i-1][j][s1][s2];//不选
if(j>=a[i])dp[i][j][s1][s2]+=dp[i-1][j-a[i]][s1][s2];//选
if(s1&&j>=a[i])dp[i][j][s1][s2]+=dp[i-1][j-a[i]][s1-1][s2];//必选
if(s2)dp[i][j][s1][s2]+=dp[i-1][j][s1][s2-1];//必不选
Sum{ dp[n][i][2][2],i=1,2,…,s }即为答案,时间复杂度O(4ns)
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define mod 1000000007ll
#define maxn 1001
int T,n,s,a[maxn],dp[maxn][maxn][3][3]; 
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&s);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        dp[0][0][0][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=s;j++)
                for(int s1=0;s1<=2;s1++)
                    for(int s2=0;s2<=2;s2++)
                    {
                        ll temp=0;
                        temp+=dp[i-1][j][s1][s2];//不选 
                        if(j>=a[i])temp+=dp[i-1][j-a[i]][s1][s2];//选 
                        if(s1&&j>=a[i])temp+=dp[i-1][j-a[i]][s1-1][s2];//必选 
                        if(s2)temp+=dp[i-1][j][s1][s2-1];//必不选 
                        dp[i][j][s1][s2]=temp%mod;
                    } 
            ll ans=0;
            for(int i=0;i<=s;i++)ans=(ans+dp[n][i][2][2])%mod;
            printf("%I64d\n",ans*4ll%mod);
    }
    return 0;
}
查看评论

HDU 5800 To My Girlfriend (动态规划)

题目链接:HDU 5800 题面: To My Girlfriend Time Limit: 2000/2000 MS (Java/Others)    Memory Limit...
  • David_Jett
  • David_Jett
  • 2016-08-07 10:54:07
  • 1025

hdu 5800 To My Girlfriend (dp)

Problem Description Dear Guo I never forget the moment I met with you.You carefully asked me: ...
  • qq_23089247
  • qq_23089247
  • 2016-08-07 11:04:49
  • 71

HDU 5800 To My Girlfriend(DP)

题意:给定n和s,求f(i,j,k,l,m)表示下标i和j的数必选,k和l不选且选出数的和为s的选法方案数。 思路:dp[i][j][k][l],表示前i个物品,权值和为j,已有k个必选,l...
  • CillyB
  • CillyB
  • 2017-09-22 00:16:40
  • 197

To My Girlfriend HDU - 5800 dp

那个式子可以想成有两个物品必拿,有两个物品必不拿,最后体积小于等于m的方案数 也是同样想到了n^3的dp,必然会T,走进死沟,看了题解,才想到... 不要考虑太多,对每个物品,有四种拿...
  • jerans
  • jerans
  • 2017-09-17 00:40:52
  • 91

HDU 5800 To My Girlfriend 【DP】

题意有n个物品,每个物品的重量是aia_i,求以下式子: ∑ni=i∑nj=1∑nk=1∑nl=1∑sm=1f(i,j,k,l,m)(i≠j≠k≠l)\sum^n_{i=i} \sum^n_{j=1...
  • DrCarl
  • DrCarl
  • 2017-01-19 10:04:17
  • 358

HDU 5800 To My Girlfriend(dp)

∑ni=1∑nj=1∑nk=1∑nl=1∑sm=1f(i,j,k,l,m)(i,j,k,laredifferent)\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}...
  • Miracle_ma
  • Miracle_ma
  • 2016-08-10 15:18:59
  • 241

hdu 5800 To My Girlfriend

∑i=1n∑j=1n∑k=1n∑l=1n∑m=1sf(i,j,k,l,m)(i,j,k,laredifferent) i,j为必选数的序号,k,l为必不选数的序号,m是背包体积。 官方题解: ...
  • stiyet
  • stiyet
  • 2016-08-06 15:40:42
  • 78

HDU 5800 To My Girlfriend

转载声明:http://blog.csdn.net/overload1997/article/details/52127995 题目链接:http://acm.hdu.edu.cn/showprob...
  • zzz805
  • zzz805
  • 2016-08-06 11:09:58
  • 250

【HDOJ 5800】To My Girlfriend(DP)

【HDOJ 5800】To My Girlfriend(DP)To My GirlfriendTime Limit: 2000/2000 MS (Java/Others)    Memory Limi...
  • ChallengerRumble
  • ChallengerRumble
  • 2016-08-04 21:42:00
  • 655

HDU 5800 To My Girlfriend(计数DP)

[题目链接][题意] 有n个物品,每个物品的价值为aia_i,设f(i,j,k,l,m)f(i,j,k,l,m)表示从n个物品中取若干个,满足第i,j个物品必取,第k,l个物品必不取,价值总和为m的...
  • MikeZHW
  • MikeZHW
  • 2016-08-09 03:12:49
  • 263
    个人资料
    持之以恒
    等级:
    访问量: 59万+
    积分: 2万+
    排名: 285
    最新评论