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背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
随机推荐
- vue开发常用配置
// src/main.js function setHtmlFontSize() { const baseSize = 100 // 由于浏览器字体最小为12px,故这个值要设置大一点,保证计算所得 ...
- PHP安装文件的审计
初始化安装 一般php程序都有一个初始安装的问题,如果使用了一些cms安装后且没有删除安装文件的话,就会导致二次安装等问题. 具体但不限于以下几种情况: 无验证功能,任意重装覆盖 $_GET['ste ...
- (Python3) 连加 连乘 代码
a=[1,2,3,4,5,6,7,8,9,10] #连加 b=0 for i in a: b+=i print(b) #连乘 c=1 for i in a: c*=i print(c)
- python3 练手实例5 做一个简单电子时钟
import time,sys,os while(1): t = time.strftime('%Y-%m-%d\n%H:%M:%S',time.localtime(time.time())) pri ...
- SEO网页优化
1.h1~h6标签的使用: 大标题(最主要的标题)用h1,依次往下. 2.为每一个在HTML里的img添加Alt属性 3.给a标签加title 4.css sprites 5.启动keep-Alive ...
- 小程序bindtap和cachetap的区别
<view bindtap='a'> 1 <view bindtap='b'> 2 <view bindtap='c'> 3 </view> </ ...
- java平台学习笔记
java程序从编写源码开始到程序执行一共有三个阶段,编写期,编译期,运行期. 通常,人们都希望自己的程序更快(不仅仅是执行更快,也有编写更快),因此java在不断更新. java源码先通过javac编 ...
- POI操作excle
将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目 ...
- 3D Slicer中文教程(七)—图像中值滤波
1.中值滤波概念 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护边缘 ...
- flask蓝图的简单使用
1.flask的简单使用 from flask import Flask # from flask import make_response app = Flask(__name__) app.con ...