lightoj 1125【背包·从n个选m个】
题意:
给你 n 个背包,然后给你两个数,D,M,问你从n个里面挑M个出来,有多少种方法能够整除D;
思路:
试想我先不挑M个出来的话,仅仅是构造一个D的倍数,其实就是构造一个数的话,
其实就是个递推,然后方案的叠加
挑M个,D的倍数。
能对M个状压;
但是对于D的倍数呢?
其实就是取膜就好了,比如5的倍数,
那么dp[个数][j]+=dp[个数-1][j-X];(个数都是状压了)
但是现在是200个里面挑10个啊。。。
不行的话就再加一维。
所以还是要从前 i 个物品推过来。。。
所以现在可以搞成dp[i][j][k]表示前i个物品选j个%D=k时的方案数;= =
每次逆推可以把第一维去掉,时间复杂度也OK;
总的来说就是:能状压么?不能解决这个事情就再开一维,一维不行上二维,二维不行三维先上了再说;(PS:n个里面选m个真是玄学。。第二遍做。。。还是碰壁GG。
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- typedef unsigned long long ULL;
- typedef pair<int,int>PII;
- const double eps=1e-5;
- const double pi=acos(-1.0);
- const int INF=0x3f3f3f3f;
- const int N=1e2+10;
- int a[N*2];
- LL dp[12][25];
- int main()
- {
- int cas=1;
- int n,w,q,d,m;
- int t,x,sum;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&q);
- for(int i=1;i<=n;i++)
- scanf("%d",&a[i]);
- printf("Case %d:\n",cas++);
- for(int k=1;k<=q;k++)
- {
- scanf("%d%d",&d,&m);
- memset(dp,0,sizeof(dp));
- dp[0][0]=1LL;
- for(int i=1;i<=n;i++)
- {
- int temp=a[i]%d;
- for(int j=m;j>=1;j--)
- for(int x=0;x<d;x++)
- dp[j][x]+=dp[j-1][(x+d-temp)%d];
- }
- printf("%lld\n",dp[m][0]);
- }
- }
- return 0;
- }
lightoj 1125【背包·从n个选m个】的更多相关文章
- lightoj 1125【01背包变性】
题意: 从n个数里选出m个来,还要使得这m个数之和被d整除. 给一个n和q,再给n个数,再给q个询问,每个询问包含两个数,d,m; 对于每个case输出每个q个询问的可行的方案数. 思路: 每个数只能 ...
- hdu 3033 I love sneakers!(分组背包+每组至少选一个)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- lightoj 1125 - Divisible Group Sums (dp)
Given a list of N numbers you will be allowed to choose any M of them. So you can choose in NCM ways ...
- hdu1011(树形背包)
hdu1011 http://acm.hdu.edu.cn/showproblem.php?pid=1011 给定n个洞穴和m个士兵(每个士兵能消灭20个bugs) 然后给定每个洞穴的bugs数量(背 ...
- 洛谷P2918 [USACO08NOV]买干草(一道完全背包模板题)
题目链接 很明显的一道完全背包板子题,做法也很简单,就是要注意 这里你可以买比所需多的干草,只要达到数量就行了 状态转移方程:dp[j]=min(dp[j],dp[j-m[i]]+c[i]) 代码如下 ...
- POJ 1112 Team Them Up! 二分图判定+01背包
题目链接: http://poj.org/problem?id=1112 Team Them Up! Time Limit: 1000MSMemory Limit: 10000K 问题描述 Your ...
- hdu 1561 树形dp+分组背包
题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...
- PAT 甲级 1068 Find More Coins(0,1背包)
1068. Find More Coins (30) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva l ...
- Kattis - redblacktree Red Black Tree (树形背包)
问题:有一课含有n(n<=2e5)个结点的数,有m(m<=1000)个结点是红色的,其余的结点是黑色的.现从树中选若干数量的结点,其中红色的恰有k个,并且每个结点都不是其他任何另一个结点的 ...
随机推荐
- javascript和c#的深度拷贝的一种通用方法
很简单,序列化后反序列化...
- 九度OJ 1108:堆栈的使用 (堆栈)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6705 解决:1974 题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压入栈顶, ...
- Win32对话框工程笔记
Main.cpp #include <Windows.h> #include "resource.h" INT_PTR CALLBACK dialogProc(HWND ...
- 用ASTERISK搭建自己的免费VOIP服务器
服务器别闲着,博主又要给大家带来新的玩法咯 1. 这里以 Debian 为例子,安装 Asterisk apt-get update apt-get install asterisk 2. 预设置 A ...
- Hadoop合并小文件的几种方法
1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支 ...
- windows server 2008 + IIS 7.5实现多用户FTP(多账号对应不同目录
在windows server 2003 + IIS 6 的时候,就已经能实现多用户FTP的功能,不过设置有写繁琐,如果站点多的话,设置账号.权限这些东西都要搞很久.Windows server 20 ...
- WSDL文档深入分析
借助jdk的wsimort.exe工具生成客户端代码 格式:wsimport -keep url //url为wsdl文件的路径 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法: 将 ...
- charles抓取线上接口数据替换为本地json格式数据
最近要做下拉刷新,无奈测试服务器的测试数据太少,没有足够的数据做下拉刷新,所以用charles抓取了测试服务器的接口,然后在伪造了很多数据返回到我的电脑上,下面来说说使用方法: 第一步: 安装FQ软件 ...
- poj3461 Oulipo —— KMP
题目链接:http://poj.org/problem?id=3461 代码如下: #include<cstdio>//poj 3461 kmp #include<cstring&g ...
- Codeforces Beta Round #56 A. Where Are My Flakes? —— 贪心
题目链接:http://codeforces.com/problemset/problem/60/A A. Where Are My Flakes? time limit per test 2 sec ...