首页 > 其他分享 >CodeForces - 788C - 完全背包

CodeForces - 788C - 完全背包

时间:2024-10-24 19:31:15浏览次数:4  
标签:... 背包 xk 788C CodeForces x2 x1 ll

题目表示(x1 * a[1] + x2 * a[2] + ... + xk * a[k]) / ((x1 + x2 + ... + xk) * 1000) = n / 1000,可以推出(x1 * a[1] + x2 * a[2] + ... + xk * a[k]) = n * (x1 + x2 + ... + xk),
进而得出(x1 * (a[1] - n) + x2 * (a[2] - n) + ... + xk * (a[k] - n)) = 0,这样处理之后就和我之前做的一道01背包的题很像CodeForces - 366C,将所有a[i] = a[i] - n,再分别对a[i] > 0 和 a[i] <= 0进行完全背包,最后找min(dp1[i] + dp2[i], mn)可能讲的不是很清楚,建议大家先做一下链接的题再回来看我这些话,可能会明朗一些。

但如果直接进行我上述的操作会有两点问题:1. k = 1e6,直接操作的话,完全背包光第一层循环就已经1e6了,太容易爆时间复杂度了;2. 对于第二层循环的大小(即背包容量)该如何确定?

对于第一个问题,k = 1e6,但a[i] <= 1e3,所以有效部分最多1e3,所以k的范围是假的,可以通过去重操作来缩小k
对于第二个问题,完全背包第二层循环一般为背包容量,处理过后的a[i]就是每个物品所占的空间大小,为了让背包容量达到极限大,我们处理之后的a[i]之间需要没有倍数关系
然后因为n是确定的,如果我们需要让处理前的形式(a[i1] - n) * (a[i2] - n)最大,n = 499,a[i1] = 1000,a[i2] = 0时,乘积最大,结果为501 * 499。
下面放代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll dp2[1000010], dp1[1000010];
ll a[1000010];
int main(){
    ll n, k, num;
    bool judge = 0;
    cin >> n >> k;
    for(ll i = 1; i <= k; i ++){
        cin >> num;
        a[i] = n - num;
        if(num == n)
        	judge = 1;
    }
    if(judge == 1){
    	cout << 1 << endl;
    	return 0;
	}
    memset(dp1, 127, sizeof(dp1));
    memset(dp2, 127, sizeof(dp2));
    sort(a + 1, a + 1 + k);
    k = unique(a + 1, a + 1 + k) - a - 1;
    ll w = 501 * 499 + 10;
    dp1[0] = 0, dp2[0] = 0;
    for(ll i = 1; i <= k; i ++){
        if(a[i] > 0)
            for(ll j = 0; j <= w - a[i]; j ++){
                dp1[j + a[i]] = min(dp1[j + a[i]], dp1[j] + 1);
            }
        else
            for(ll j = 0; j <= w - a[i]; j ++){
                dp2[j - a[i]] = min(dp2[j - a[i]], dp2[j] + 1);
            }
    }
    ll mn = 1e18;
    for(ll i = 1; i <= w; i ++){
    	if(dp1[i] != dp1[1000005] && dp2[i] != dp2[1000005])
        	mn = min(dp1[i] + dp2[i], mn);
    }
    if(mn == 1e18){
        cout << "-1" << endl;
    }
    else{
        cout << mn << endl;
    }
    return 0;
}

对于背包容量的问题,我一直没想明白,就拖着,今天又继续想,大概想明白了,可能表述还是太模糊了,大家可以理解理解 我还是太蒻了,加油吧

标签:...,背包,xk,788C,CodeForces,x2,x1,ll
From: https://www.cnblogs.com/-zzuxx-/p/18444728

相关文章

  • Codeforces Round 980 (Div. 2)
    CodeforcesRound980(Div.2)总结A简单小学算数题。如果\(b\lea\),直接输出\(a\)。否则,列方程\(a-x=b-2x\),\(x=b-a\),输出\(a-x\),即\(2a-b\)。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<c......
  • DAY42 ||完全背包理论 | 518. 零钱兑换 II | 377. 组合总和 Ⅳ|70. 爬楼梯 (进阶)
    完全背包理论什么是完全背包:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。不......
  • [算法题解] Codeforces round 979 --D. QED's Favorite Permutation
    题目链接:https://codeforces.com/contest/2030/problem/D题目:题解:FavotitePermutation即每个数满足i=p[i];此题中,p数组每次询问后保持不变,s根据询问而改变。因此每次需要进行交换的数的位置是相同的,只需要检验s变更后,操作能否满足交换需求与否。故创建需数组need,预处理nee......
  • Codeforces Round 966 (Div. 3) A - G
    linkvp赛时过了ABD,CE没做出来,唐完了eee感觉自己真的可以退役了A-PrimaryTaskB-SeatinginaBusC-NumericStringTemplate这题很简单,开两个map扫一遍就可以了,但是赛时我只开了一个,然后居然没调出来qwq,降智D-RightLeftWrong很显然的贪心,最左边配对......
  • Codeforces Round 980 (Div. 2) C题
    sort用法Sort(start,end,cmp)voidsort(RandomAccessIteratorfirst,RandomAccessIteratorlast,Comparecomp);参数[5](1)start表示要排序数组的起始地址;迭代器的起始位置,对于数组来说就是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。(2)end表示数组结束地......
  • Codeforces Round 980 (Div. 2)
    A.ProfitableInterestRate题意:Alice有\(a\)元钱。银行有两种业务:业务A:存钱,但是要求最少要存\(b\)元业务B:花费x元,使得业务A中的要求\(b\)减少\(2*x\)元求Alice最多可以存多少钱分析如果Alice要存钱,要使得\((ans=a-x)\)就要大于业务A的要求\[\left\{\beg......
  • 代码随想录算法训练营Day42 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、
    目录完全背包理论基础518.零钱兑换II377.组合总和Ⅳ卡玛网57.爬楼梯(进阶版)完全背包理论基础题目52.携带研究材料(第七期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间......
  • Codeforces 977 E1 Digital Village 贪心证明
    问题重述(原题简化得来):给定一个简单联通无向图,包含n个顶点,每条边有一个正整数边权。定义两顶点距离为两顶点间路径最大边权的最小值。记k个顶点为特殊顶点,记f(i)为i顶点分别到k个顶点的k个距离中的最小距离,记score=f(1)+f(2)+...+f(n)。现在需要最小化score。则以下贪心算法是正确......
  • Codeforces Round 980 (Div. 2)
    A-ProfitableInterestRatevoidsolve(){ cin>>n>>m; if(n>=m)cout<<n<<'\n'; else { intc=m-n; if(c>=n)cout<<"0\n"; elsecout<<n-c<<'\n'; } return;}B-Buyin......
  • 「题解」Codeforces Round 980 (Div. 2)
    before\(A\simD\)的题解A.ProfitableInterestRateProblemA.ProfitableInterestRateSol&Code数学题,有\(a-x\geqb-2x\),得\(x=b-a\)。特判\(a\geqb\)以及\(a<x\)的情况即可。#include<bits/stdc++.h>#defineM10001#defineN......