cf632e dp
来源:互联网 发布:淘宝买家怎么实名认证 编辑:程序博客网 时间:2024/06/03 18:25
题意:给你n种物品以及每种的价值,每一种物品可以任意取多次,问恰好取k次物品能取到的所有可能价值。
思路:容易想到4维dp,用dp[i][j]表示取i次,价值为j是否存在,但是这样的复杂度为10^12爆了,所以要减少一维,先对n个数排序,然后n个数都减去第一个数(这样做的目的是恰好k次很难dp,n个数都减去最小的数后,第1个数就变为0,在这样的情况下,如果我们凑到价值为i的物品少于k件,如只用k-2件拼凑,那么另外两件可以看做都用第1个物品),然后用dp[i]表示最后取到价值为i的物品,dp就行了。
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<string>#include<algorithm>#define inf 99999999#define pi acos(-1.0)#define maxn 1005#define MOD 1000000007using namespace std;typedef long long ll;typedef long double ldb;int dp[maxn*maxn],a[maxn];int main(){ int n,m,i,j,k; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++){ scanf("%d",&a[i]); } sort(a+1,a+1+n); int t=a[1]; for(i=1;i<=n;i++){ a[i]-=t; } for(i=0;i<=1000000;i++)dp[i]=inf; dp[0]=0; for(i=1;i<=n;i++){ {for(j=0;j<=1000000;j++) if(j>=a[i]){ dp[j]=min(dp[j],dp[j-a[i] ]+1); } } } int flag=1; for(j=0;j<=1000000;j++){ if(dp[j]<=k){ printf("%d ",j+t*k); } } printf("\n"); } return 0;}
阅读全文
0 0
- cf632e dp
- [CF632E]选择
- dp
- dp
- dp
- 【DP】
- dp
- dp
- DP
- DP
- DP
- DP
- DP
- dp
- DP
- dp
- DP
- DP
- B
- 中大型网站架构的演变之路
- 自定义view继承view
- Oracle 分组函数
- G
- cf632e dp
- 磁盘管理4--磁盘阵列RAID
- mac 使用技巧(持续更新)
- 算法基础
- C
- 阿里云幸运券领取,阿里云服务器全线云产品优惠
- 在女生湿透的衣服竟然会显示这样的体型 连继好几天的大旱,每逢晚上是不是都无法入眠,或总是深夜醒来背流行夹法的,就在前几晚上我们的小区经常没电,当时我还想这么个大城市,还会大晚上还会没电真让人
- 【跟着stackoverflow学Pandas】“Large data” work flows using pandas-pandas大数据处理流程
- 0804 OpenJ#7215 简单的整数划分问题