zoukankan      html  css  js  c++  java
  • 【JZOJ6309】完全背包【背包】

    题目大意:

    题目链接:https://jzoj.net/senior/#main/show/6309
    一个容量为mm的背包,共nn件物品,每件物品都有无限个,求能装下最大的价值。
    n106,m1016nleq 10^6,mleq 10^{16},物品的价值和重量100leq 100


    思路:

    发现这道题物品价值和重量很小。在相同重量下,显然选择价值越高的越优,所以这道题就可以简化成只有100个物品。
    f[i]f[i]表示重量为ii时的最大价值和。我们可以贪心把101610^{16}的背包拆分成若干个相同的小背包,剩余的空间就用另一种不同的背包装。
    所以我们就只要把背包做到1+2+...+100=50501+2+...+100=5050就可以了。然后枚举用多大的背包就可以了。


    代码:

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    const int N=10010;
    ll f[N],v[N],m,ans;
    int n;
    
    int main()
    {
    	freopen("backpack.in","r",stdin);
    	freopen("backpack.out","w",stdout);
    	scanf("%d%lld",&n,&m);
    	for (int i=1,x,y;i<=n;i++)
    	{
    		scanf("%d%d",&x,&y);
    		if (y>v[x]) v[x]=y;
    	}
    	for (int i=1;i<=10000;i++)
    	{
    		for (int j=1;j<=min(i,100);j++)
    			f[i]=max(f[i],f[i-j]+v[j]);
    		ans=max(ans,m/i*f[i]+f[m%i]);
    	}
    	printf("%lld",ans);
    	return 0;
    } 
    
  • 相关阅读:
    JS在线编辑器
    meta标签
    webstorm快捷键
    微信JS-SDK调用
    iOS -- UIApplication
    Xcode -- apple llvm 6.0 error错误如何解决
    C -- 字符串数组与字符串指针
    MAC -- 小技巧
    C语言 -- 折半查找小程序
    C -- 小程序
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998052.html
Copyright © 2011-2022 走看看