C - Thief in a Shop

思路 :严格的控制好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生成函数的更多相关文章

  1. 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 ...

  2. 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 ...

  3. CF632E Thief in a Shop 和 CF958F3 Lightsabers (hard)

    Thief in a Shop n个物品每个价值ai,要求选k个,可以重复.问能取到哪几个价值? 1 ≤ n, k ≤ 1000,1 ≤ ai ≤ 1000 题解 将选一个物品能取到的价值的01生成函 ...

  4. 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 ...

  5. codeforces Educational Codeforces Round 9 E - Thief in a Shop

    E - Thief in a Shop 题目大意:给你n ( n <= 1000)个物品每个物品的价值为ai (ai <= 1000),你只能恰好取k个物品,问你能组成哪些价值. 思路:我 ...

  6. 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 ...

  7. USACO Money Systems Dp 01背包

    一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...

  8. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  9. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

随机推荐

  1. ActiveMQ 的安装与使用(单节点)

    环境:CentOS6.6.JDK8 1.下载:http://archive.apache.org/dist/activemq/5.11.1/apache-activemq-5.11.1-bin.tar ...

  2. spring boot项目能启动打包失败

    如题,项目本地可以正常启动.但是用 mvn clean package打包就失败! 事件原因如下: 一.pom.xml少packing元素 <groupId>com.sanyi</g ...

  3. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  4. 20155324《网络对抗》Exp2 后门原理与实践

    20155324<网络对抗>Exp2 后门原理与实践 20155324<网络对抗>Exp2 后门原理与实践 常用后门工具实践 Windows获得Linux Shell 在Win ...

  5. MyRolan (快速启动小工具)

    类似 Rolan的快速启动工具. 启动后隐藏,当鼠标移至左上角时,窗口显示,点击项目可运行程序. GitHub地址: MyRolan . #if defined(UNICODE) && ...

  6. sqlmap注入入门

    sqlmap注入入门 sqlmap的用法: ​ linux中: sqlmap [选项] ​ Windows中: python sqlmap [选项] 常用的参数及含义: 目标 ​ -d DIRECT ...

  7. Linux使用CFSSL自签TLS证书

    ⒈安装CFSSL wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson ...

  8. HDMI热插拔检测原理

    HDMI(19Pin)/DVI(16 pin)的功能是热插拔检测(HPD),这个信号将作为主机系统是否对HDMI/DVI是否发送TMDS信号的依据.HPD是从显示器输出送往计算机主机的一个检测信号.热 ...

  9. apache无法启动报错No space left on device

    apache无法启动报错No space left on device 故障现象:apache无法启动ipcs信号量很多 # service httpd startStarting httpd : [ ...

  10. Android 使用gradle版本冲突

    gradle默认版本冲突解决策略:自动依赖最高版本jar包 修改默认解决策略,使之出现版本错误时报错 configurations.all{ resolutionStrategy{ failOnVer ...