zoukankan      html  css  js  c++  java
  • Loj #2256. 「SNOI2017」英雄联盟

    题目

    我就是个丝薄

    如果要用(dp_i)表示凑出(i)的最小花费显然不可能的

    之后大力猜想能凑出来的状态不会很多,我的暴力也告诉我不是很多,好像也确实不多的样子,大概(4e4)左右

    但是我就这样思维僵化了,背包套路难道不是看到某一维特别大就把交换一下这一维和(dp)值吗

    于是(dp_i)表示使用(i)的费用凑出的最大的数

    分组背包大力转移即可

    代码

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define re register
    #define LL long long
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    const int maxn=150;
    inline int read() {
    	char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
    	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
    }
    int n,a[maxn],b[maxn],now[maxn];
    LL m;
    LL dp[2000*150];
    int main() {
    	n=read();scanf("%lld",&m);
    	for(re int i=1;i<=n;i++) a[i]=read();
    	for(re int i=1;i<=n;i++) b[i]=read();
    	for(re int i=1;i<=n;i++) now[i]=now[i-1]+a[i]*b[i];
    	memset(dp,-1,sizeof(dp));
    	dp[0]=1;
    	for(re int i=1;i<=n;i++) {
    		for(re int j=now[i];j;--j)
    			for(re int k=2;j-k*b[i]>=0&&k<=a[i];++k)
    				dp[j]=max(dp[j],dp[j-k*b[i]]*k);
    	}
    	for(re int i=0;i<=now[n];i++) 
    	if(dp[i]>=m) return printf("%d
    ",i),0;
    	return 0;
    }
    
  • 相关阅读:
    【PAT甲级】1034 Head of a Gang (30分):图的遍历DFS
    循环的嵌套
    0.1+07 !=0.8的原因
    java script-页面交互
    java script-逻辑分支
    java script-数据类型转换&&运算符
    java script概述
    浏览器内核
    网格布局
    让一个元素在父元素上下左右居中
  • 原文地址:https://www.cnblogs.com/asuldb/p/10607063.html
Copyright © 2011-2022 走看看