C - Thief in a Shop - dp完全背包-FFT生成函数
思路 :严格的控制好k的这个数量,这就是个裸完全背包问题.(复杂度最极端会到1e9)
他们随意原来随意组合的方案,与他们都减去 最小的 一个 a[ i ] 组合的方案数目是不会改变的
那么我们就 dp [ i ]表示 i 这个价格需要的最少 个数。 这样求最小个数保证不会漏解
然后 如果这个 i 能通过 1 - k 个物品组合出来,那么 一定能通过k 个物品组合出 i + k * a [ 1 ].
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 1234567
int n,k,dp[maxn],a[maxn];
int v[maxn],mi,sum,id,base;
map<int,bool>vis;
vector<int>ans;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
if(vis[a[i]]==0)
{
vis[a[i]]=1;
v[++id]=a[i];
}
}
sort(v+1,v+1+id);
base=v[1]*k;
for(int i=2; i<=id; i++)
v[i]-=v[1];
sum=v[id]*k;
memset(dp,inf,sizeof(dp));
dp[0]=0;
for(int i=2; i<=id; i++)
for(int j=v[i]; j<=sum; j++)
dp[j]=min(dp[j],dp[j-v[i]]+1);
for(int i=0; i<=sum; i++)
{
if(dp[i]>k)continue;
ans.push_back(i+base);
}
int len=ans.size();
for(int i=0; i<len; i++)
{
printf("%d",ans[i]);
if(i<len-1)printf(" ");
else printf("\n");
}
return 0;
}
思路:最初有的ai 初始化系数为1进行操作k次卷积。注意补零操作,然后注意最大长度,
也就是最终结果可能得到的最大指数 ....
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <cmath>
using namespace std;
const double PI = acos(-1.0);
struct complex
{
double r,i;
complex(double _r = 0.0,double _i = 0.0)
{
r = _r;
i = _i;
}
complex operator +(const complex &b)
{
return complex(r+b.r,i+b.i);
}
complex operator -(const complex &b)
{
return complex(r-b.r,i-b.i);
}
complex operator *(const complex &b)
{
return complex(r*b.r-i*b.i,r*b.i+i*b.r);
}
};
void change(complex y[],int len)
{
int i,j,k;
for(i = 1, j = len/2; i < len-1; i++)
{
if(i < j)swap(y[i],y[j]);
k = len/2;
while( j >= k)
{
j -= k;
k /= 2;
}
if(j < k) j += k;
}
}
void fft(complex y[],int len,int on)
{
change(y,len);
for(int h = 2; h <= len; h <<= 1)
{
complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
for(int j = 0; j < len; j+=h)
{
complex w(1,0);
for(int k = j; k < j+h/2; k++)
{
complex u = y[k];
complex t = w*y[k+h/2];
y[k] = u+t;
y[k+h/2] = u-t;
w = w*wn;
}
}
}
if(on == -1)
for(int i = 0; i < len; i++)
y[i].r /= len;
}
const int MAXN = 5234567;
complex x1[MAXN],x2[MAXN];
char str1[MAXN/2],str2[MAXN/2];
int sum[MAXN];
int siz[1100];
int main()
{
int n,k;
scanf("%d %d", &n, &k);
int x;
int MAX = 0;
memset(siz,0,sizeof(siz));
for(int i = 1; i <= n; i++)
{
scanf("%d", &x);
siz[x] = 1;
MAX = max(MAX,x);
}
int len1 = MAX * k;
int len = 1;
while(len < len1) len <<= 1;
for(int i = 0; i < len; i++)
x1[i] = complex(siz[i],0);
x2[0] = complex(1,0);
for(int i=1; i < len; i++)
x2[i] = complex(0,0);
fft(x1,len,1);
fft(x2,len,1);
while(k)
{
if(k % 2 == 1)
{
for(int i = 0; i <len; i++)
x2[i] = x1[i]*x2[i];
fft(x2,len,-1);
for(int i = 0; i < len; i++)
{
sum[i] = (int)(x2[i].r + 0.5);
if(sum[i])x2[i]=complex(1,0);
else x2[i]=complex(0,0);
}
fft(x2,len,1);
}
for(int i =0; i < len; i++)
x1[i] = x1[i]*x1[i];
fft(x1,len,-1);
for(int i = 0; i < len; i++)
{
sum[i] = (int)(x1[i].r + 0.5);
if(sum[i])x1[i]=complex(1,0);
else x1[i]=complex(0,0);
}
fft(x1,len,1);
k /= 2;
}
fft(x2,len,-1);
for(int i = 0; i < len; i++)
{
sum[i] = (int)(x2[i].r + 0.5);
}
for(int i = 0; i <len; i++)
{
if(sum[i])
printf("%d ",i);
}
return 0;
}
C - Thief in a Shop - dp完全背包-FFT生成函数的更多相关文章
- Educational Codeforces Round 9 E. Thief in a Shop dp fft
E. Thief in a Shop 题目连接: http://www.codeforces.com/contest/632/problem/E Description A thief made hi ...
- codeforces632E. Thief in a Shop (dp)
A thief made his way to a shop. As usual he has his lucky knapsack with him. The knapsack can contai ...
- CF632E Thief in a Shop 和 CF958F3 Lightsabers (hard)
Thief in a Shop n个物品每个价值ai,要求选k个,可以重复.问能取到哪几个价值? 1 ≤ n, k ≤ 1000,1 ≤ ai ≤ 1000 题解 将选一个物品能取到的价值的01生成函 ...
- codeforces 632+ E. Thief in a Shop
E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input standard ...
- codeforces Educational Codeforces Round 9 E - Thief in a Shop
E - Thief in a Shop 题目大意:给你n ( n <= 1000)个物品每个物品的价值为ai (ai <= 1000),你只能恰好取k个物品,问你能组成哪些价值. 思路:我 ...
- codeforces 632E. Thief in a Shop fft
题目链接 E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input stan ...
- USACO Money Systems Dp 01背包
一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
随机推荐
- jmeter中的参数化
1.那些场景需要参数化? 1.登陆认证信息 2.一些和时间相关的,违反时间约束的[时间点和当前时间不一致的情况等等] 3.一些受其他字段约束的[例如字段的一些限制条件] 4.一些来自于其他数据源[例如 ...
- 解决系统中大量的TIME_WAIT连接
今天发现网站特别卡!! 查看网络连接数: netstat -an |wc -l netstat -an |grep xx |wc -l 查看某个/特定ip的连接数 netstat -an ...
- Bootstrap常用样板
http://blog.csdn.net/Star_449/article/details/76098292 1.图片样式 1.1..img-responsive: 直接为图片添加该样式,可以实现响应 ...
- HttpClient基本使用
1.在pom.xml加入对httpclient的必需的jar包的依赖 <!--//httpclient的接口基本都在这儿--> <dependency> <groupId ...
- 题解 洛谷P3936 Coloring
考虑搜索,发现复杂度爆炸 贪心,正确性过低(~~实测爆炸~~) 于是,~~发现~~这题是模拟退火 这里不讲解退火的定义了,初学退火可以去平衡点 退火本身维护一个答案图像,答案的q,当前图 ...
- git工具——版本的创建与回退
1.创建一个版本库 进入要管理的文件路径:cd f:/ZK/Opencv3.4.2-YOLOv3 输入命令: git init 2.版本创建与回退 在文件目录下创建一个文件code.txt: vi c ...
- 盒子取球C语言 蓝桥杯
盒子取球方法二今盒子里有 n 个小球,A.B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个, 也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定:每个人从盒子中取出 ...
- PostgreSQL对汉字按拼音排序
转自:https://www.cnblogs.com/gaojian/p/3188609.html postgres=# \l List of databases Name | Owner | Enc ...
- .NET Core----七牛云图片上传
在引用官方的qiniu.core的nuget是总是发生错误,错误如下,所以就在网上找到了一种解决方案,并稍微改进了一番, 以下是引用图: 方法一: 第一步:引用nuge 第二步:新建项目新建控制器视图 ...
- goland 文件头自动注释
1 代码 /** * @Author: ${USER} * @Description: * @File: ${NAME} * @Version: 1.0.0 * @Date: ${DATE} ${TI ...