题意:在集合中挑一些数,形成一个集合S,剩下的数形成另一个集合P,使得S>= P ,并且对于S中任意元素ai,S-ai<=P

问有多少种方案。

题目链接:https://nanti.jisuanke.com/t/41420

只要减S堆中最小的石头后满足条件,那么该取法就满足题意

设dp【k】为S堆总重量为k的方案数

把ai从大到小排序;遍历时ai就变成了最小的那块石头

所以就是01背包,取或不取这个石头;最后把满足题目条件的加到ans中

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+7;
ll dp[150005];
int a[305];
int main()
{
int i,j,n,t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ll sum=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a+1,a+1+n,greater<int>());
memset(dp,0,sizeof dp);
dp[0]=1;
ll ans=0;
for(i=1;i<=n;i++){
for(j=sum;j>=a[i];j--){
dp[j]=(dp[j]+dp[j-a[i]])%mod;
if(j>=sum-j&&j-a[i]<=sum-j)ans=(ans+dp[j-a[i]])%mod;
//满足条件就把选了a【i】的方案数dp[j-a[i]]加上 而dp【j】则包含了没选a【i】的方案数,没选的前面已经加过了
}
}
printf("%lld\n",ans);
}
return 0;
}

最新文章

  1. PHP实现linux命令tail -f
  2. bootstrap 20161012
  3. EF的增删改查
  4. 在项目中引用GreenDroid库
  5. R语言-简单线性回归图-方法
  6. poj 1556 (Dijkstra + Geometry 线段相交)
  7. JSP起源、JSP的运行原理、JSP的执行过程
  8. linux 查看局域网内ip
  9. Eclipse 代码自动补全
  10. mysql 存储过程中的declare 和 set @的两种变量的区别
  11. 通过 IP 访问谷歌
  12. malloc、calloc、realloc三者的差别
  13. 201521123111《Java程序设计》第7周学习总结
  14. Qt对象树
  15. YTKNetwork源码详解
  16. 本地项目托管到github上
  17. RTTI D7
  18. Unity3d中默认函数调用顺序(MonoBehaviour)
  19. page_address()函数分析--如何通过page取得虚拟地址
  20. git 设置只输入一次用户名和密码

热门文章

  1. 前端之Vue day 05 父子通信、ref、动态组件、插槽、计算监听属性
  2. BundleFusion_Ubuntu_Pangolin 安装的一些error
  3. Django初识(一)
  4. php 反序列化字符串逃逸
  5. 日常遇到bug小记
  6. The Semantics of Constructors——2.4 成员初始化列表
  7. MySQL 的limit
  8. MySQL时区的问题
  9. 全链路压测SOP
  10. python使用SAP GUI操作SAP的几个坑