To My Girlfriend

Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1326    Accepted Submission(s): 515

Problem Description
Dear Guo
I never forget the moment I met with you.You carefully asked me: "I have a very difficult problem. Can you teach me?".I replied with a smile, "of course"."I have n items, their weight was a[i]",you said,"Let's define f(i,j,k,l,m) to be the number of the subset of the weight of n items was m in total and has No.i and No.j items without No.k and No.l items.""And then," I asked.You said:"I want to know

∑i=1n∑j=1n∑k=1n∑l=1n∑m=1sf(i,j,k,l,m)(i,j,k,laredifferent)

Sincerely yours,
Liao

Input
The first line of input contains an integer T(T≤15) indicating the number of test cases.
Each case contains 2 integers n, s (4≤n≤1000,1≤s≤1000). The next line contains n numbers: a1,a2,…,an (1≤ai≤1000).
 
Output
Each case print the only number — the number of her would modulo 109+7 (both Liao and Guo like the number).
Sample Input
2
4 4
1 2 3 4
4 4
1 2 3 4
 
Sample Output
8
8
 
Author
UESTC
 
Source
Recommend
wange2014   |   We have carefully selected several similar problems for you:  6032 6031 6030 6029 6028 
 
题解:

就是给你 n个数 其中(序号i,j)是必选的,(序号k,l)是必不选的.使得其中的子集在n个数中的总权值为m. 
例如样例 
f(1,2,3,4)=1 f(2,1,3,4)=1 f(1,3,2,4)=1 f(3,1,2,4)=1 
f(1,2,4,3)=1 f(2,1,4,3)=1 f(1,3,4,2)=1 f(3,1,4,2)=1 所以答案为8.

个人感想: 
看了一下题目,我基本没什么思路,然后喵了一下题解,说是dp,然后我想了一个晚上..我觉得自己真是弱鸡,还是没怎么想到,看了网上题解,可以推出朴素的O(n^3)算法,我尼玛我一点感觉也没,我都不知道怎么推出朴素了..我反而悟出了这道题的前2维的计数,但是我就想不到怎么把必选不选的排掉.很烦躁
然后还是看了一下转载了.但是我就想不通最后两维,好艰难啊. 
今天早上还是琢磨了一下,我才把它弄懂.

se->select. 
dp[i][j][se][nse] 代表 前i个数,和为j,有se个数必选,有nse个必不选的方案数
是不是很凌乱.我们一步步来,先想前2维.我到不知道为什么别人数是个背包,千万别和背包混一起,我感觉会走弯路,不过确实也类似了.

我的开始是这样想的. 
首先 dp[i][j].前i个数和为j,对于当前这个数,如果选择了,就得+dp[i-1][j-a[i]],这时如果不选,+dp[i-1][j].这个先想明白. 
然后再想到第3维(第4维也是类似). 
dp[i][j][1]+=dp[i-1][j][1] ,首先前[i-1]个数和为j的方案数,而且其中有1个是必选了,但没有选a[i]
dp[i][j][1]+=dp[i-1][j-a[i]][1],首先前[i-1]个数和为j的方案数,而且其中有1个是必选了,,但选了a[i].a[i],不是必选的
dp[i][j][1]+=dp[i-1][j-a[i]][0],首先前[i-1]个数和为j的方案数,而且其中有1个是必选了,,选了a[i].a[i]是必选的
这样理解应该懂了吧,其中1维也是这样的思想..这就推出来了几种必选必不选的方案数了.

分析: 计数dp.

转载:http://blog.csdn.net/zzz805/article/details/52135094

#include <bits/stdc++.h>

using namespace std;
const int mod=1e9+;
int dp[][][][];
int n,s,T;
int a[];
int main()
{
scanf("%d",&T);
for(;T>;T--)
{
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,,sizeof(dp));
dp[][][][]=;
for(int i=;i<=n;i++) //前i件物品
for(int j=;j<=s;j++) //背包当前容量为j
for(int x=;x<=;x++) //dp[i][j]x][y]中有x个物品是属于必选的
for(int y=;y<=;y++) //dp[i][j][x][y]中有y个物品是属于不能选的
{
dp[i][j][x][y]=(dp[i][j][x][y]+dp[i-][j][x][y])%mod; //第i件item不选
if (y->=) dp[i][j][x][y]=(dp[i][j][x][y]+dp[i-][j][x][y-])%mod;
if (j-a[i]>=)
{
dp[i][j][x][y]=(dp[i][j][x][y]+dp[i-][j-a[i]][x][y])%mod;
if (x->=) dp[i][j][x][y]=(dp[i][j][x][y]+dp[i-][j-a[i]][x-][y])%mod;
}
}
long long ans=;
for(int j=;j<=s;j++) ans=(ans+dp[n][j][][])%mod;
ans=(ans*)%mod;
printf("%lld\n",ans);
}
return ;
}

hdu 5800 To My Girlfriend(背包变形)的更多相关文章

  1. HDU 5800 To My Girlfriend 背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5800 To My Girlfriend Time Limit: 2000/2000 MS (Java ...

  2. hdu 5800 To My Girlfriend + dp

    传送门:hdu 5800 To My Girlfriend 题意:给定n个物品,其中i,j必选,l,m必不选,问组成体积为s的方法一共有多少种 思路:定义dp[i][j][s1][s2],表示前i种物 ...

  3. HDU 5800 To My Girlfriend

    背包变形.dp[i][j][g][h]表示前i个数字,和为j,有g个必选,有h个必不选的方案数. 答案为sum{dp[n][j][2][2]}*4 #pragma comment(linker, &q ...

  4. HDU 5534 Partial Tree (完全背包变形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题意: 给你度为1 ~ n - 1节点的权值,让你构造一棵树,使其权值和最大. 思路: 一棵树上 ...

  5. HDU 5800 To My Girlfriend(单调DP)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5800 [题目大意] 给出一个容量上限s,f[i][j][k][l][m]表示k和l两个物品不能选,i ...

  6. hdu 3466 Proud Merchants 01背包变形

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  7. HDU 3602 2012【01 背包变形】

    题意: 有 n 个团队和 m 艘船,每艘船的载客量为 k,每个团队的人数为ai+1 ,转载该团队可获利润 bi,要求每个团队的所有人必须在同一艘船上, 且团队优先级高的团队所在船编号不能大于优先级低的 ...

  8. HDU 2546 饭卡 01背包变形

    题目大意:中文题就不多说了 题目思路:由题意可知,只要高于5元,就可以随便刷,那我们就把最贵的留在最后刷.但是如果低于5元就什么也不能刷(哪怕你要买的物品价格不足五元),所以我们可以先求出(n-5)元 ...

  9. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. 【转】深入浅出UML类图

    转自:http://www.cppblog.com/API/archive/2013/07/04/201506.html 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin ...

  2. Linux中LVM2原理

    一.LVM原理 [MD]:Multi Device 多设备 Mdadm是一个用户空间工具,是RAID的管理工具,与真正的RAID工作没有太大关系.真正的RAID集成在linux内核中 [DM]Devi ...

  3. 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解

    源: 线性代数的本质 内容来自字幕. Let me quote without further comment from Dieudonné's "Foundations of Modern ...

  4. Sublime text3:安装插件SublimeREPL解决不支持input

    Sublime text3:安装插件SublimeREPL解决不支持input 安装SublimeREPL 1,调用ctrl+shift+p 输入install回车: 2,输出:sublimerepl ...

  5. Cisco 交换Trunk配置

    交换Trunk配置 #进入直连端口下 config)#int f0/1 #配置trunk封装协议 config)#switchport trunk encapsulation dot1q #配置为tr ...

  6. elasticsearch搜索集群基础架构

    1.  elasticsearch cluster搭建 http://www.cnblogs.com/kisf/p/7326980.html   为了配套spring boot,elasticsear ...

  7. thrift使用上面的一些坑

    https://blog.csdn.net/andylau00j/article/details/53912485

  8. 20135320赵瀚青LINUX第六周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这周主要讲解的是进程. ...

  9. 2017阿里C++研发工程师-校招-笔试模拟

    题目描述: 猎人把一对兔子婴儿(一公一母称为一对)放到一个荒岛上,两年之后,它们生00下一对小兔,之后开始每年都会生下一对小兔.生下的小兔又会以同样的方式继续繁殖. 兔子的寿命都是x(x>=3) ...

  10. Apache-solr

    1.1. 下载 从Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.t ...