• 题解 GDFZOJ 【647】 完全背包


    GDFZOJ原题地址戳这儿

    洛谷原模板题戳这儿

    这是一道(Dp)的模板题,也没什么好说的,直接开始吧

    一、审题

    有N件物品和一个容量为(V)的背包。每种物品均有无穷多件,第(i)件物品所占空间是(C_i),价值是(W_i)。求解将哪些物品装入背包可使价值总和最大。

    数据范围:(0 le V le 1000,0le Nle 100,0 < C le 1000,0 < W le 100)

    似乎并没有什么关键点,粗略判断时间复杂度,(emm······)(O(NV))是可以过的,那就往这方面想吧

    二、做题

    我们发现这道题是不是和这道题这道题很像?是的这两道题之间的差异只在这一句话( ext{“每种物品均有无穷多件”}),所以可以推断出这道题的式子一定和上一道题很像,所以建议先看一看上一题的题解

    在上一篇题解里我们在一维数组中说到( ext{重点就是,一维内层循环要倒着来!不然会重复}),这是在01背包中需要做的,但是在这里就不需要了呀,反正每种物品都有无穷多件,为什么要考虑重合呢?

    所以直接从小到大枚举就行啦!!!

    三、代码

    #include<bits/stdc++.h>
    using namespace std;
    int aa[1000001],bb[1000001],f[1000001];
    int a,b,c,d;
    int main()
    {
    	scanf("%d%d",&a,&b);
    	for(int i=1;i<=b;++i) scanf("%d%d",aa+i,bb+i);
    	for(int i=1;i<=b;i++)
    	{
    		for(int j=aa[i];j<=a;j++)
    		{
    			f[j]=max(f[j],f[j-aa[i]]+bb[i]);
    		}
    	}
    	printf("%d",f[a]);
    }
    

    完美撒花!!!

  • 相关阅读:
    448. Find All Numbers Disappeared in an Array
    447. Number of Boomerangs
    441. Arranging Coins
    438. Find All Anagrams in a String
    437. Path Sum III
    434. Number of Segments in a String
    422. Valid Word Square
    415. Add Strings
    414. Third Maximum Number
    [codility]Array-closest-ascenders
  • 原文地址:https://www.cnblogs.com/zhnzh/p/13431122.html
Copyright © 2020-2023  润新知