国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

有一些東西必不可少(前后背包+二分/前綴和優(yōu)化)

這篇具有很好參考價值的文章主要介紹了有一些東西必不可少(前后背包+二分/前綴和優(yōu)化)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題意:
給定n個物品,每個物品具有權(quán)值a[i],在這些物品里選出若干個物品,使得權(quán)值和>=k,就說是一個合法的方案。對于一個物品,如果存在一個合法的方案,在這個方案中去掉它以后方案就變成不合法了,就說這個物品是“必要的”。求有多少個物品是必要的。
n<=5000,k<=5000
思路: 如果a[i]>=k,一定必要,因為存在只包含他自己的方案,去掉他就不合法了。對于a[i]<k,如果其他物品能夠湊出一個方案,權(quán)值和在[k-a[i],k-1]之間,該物品同樣是必要的。所以想到一種樸素的想法,就是去掉某一個物品,然后依次進行01背包。但是這樣很lao,因為時間復雜度會達到n * n * k. 可以用可逆背包鏈接
或者用一種預(yù)處理前綴后綴背包的手法,比如說dp[i][j]表示前i個物品,能否湊出j。dp2[i][j]表示從n到i這些物品,能否湊出j.
預(yù)處理dp之后,對于每個物品i,看是否存在dp[i-1][l]和dp[i+1][r],他們都是合法方案,且滿足 k-a[i]<=l+r<=k-1.
顯然枚舉l、r很慢,但是可以只枚舉l,另一個通過二分得到。

枚舉l,此時r滿足k-a[i]-l<=r,lower_bound得到r的左邊界,之后判斷r是否滿足r<=k-1-l,即可判斷是否存在合法方案。
但是這樣帶一個log,像python這種運行慢的語言可能會被卡掉。

所以想到了用前綴和優(yōu)化,我們還是枚舉l,但是r不用二分了。sum[i][j]存dp2某一行的前綴和,表示用n到i這些數(shù),和<=j的方案數(shù)。
有一些東西必不可少(前后背包+二分/前綴和優(yōu)化),c++,算法
根據(jù)左側(cè)數(shù)j的大小,分情況討論右側(cè)x的范圍??梢园l(fā)現(xiàn)這兩種情況的方案數(shù)分別對應(yīng)了sum[i+1][k-1-j]和sum[i+1][k-1-j] - sum[i+1][k-a[i]-j-1],這就是前綴和的魅力。如果不是很理解,建議仔細思考一下sum數(shù)組是這些數(shù)能湊出<=j的方案數(shù),用能湊出<=10的方案數(shù)減去<=5的方案數(shù),就是湊出的值在[6,10]之間的方案數(shù)了。
時間復雜度: O(nk*log(k))或O(nk)
代碼:
二分版:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 5002;
int n,m,k,T;
bool dp[N][N];
bool dp2[N][N];
int b[N];
int a[N];
int main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>m>>k;
    n = 0;
    int ans = 0;
    for(int i=1;i<=m;++i)
    {
    	cin>>b[i];
    	if(b[i]>=k) ans++;
    	else a[++n] = b[i];
	}
	dp[0][0] = 1;
	dp2[n+1][0] = 1;
	for(int i=1;i<=n;++i)
	{
		for(int j=0;j<=k;++j)
		{
			dp[i][j] |= dp[i-1][j]; 
			if(j>=a[i]) dp[i][j] |= dp[i-1][j-a[i]];
		}
	}
	for(int i=n;i>=1;--i)
	{
		for(int j=0;j<=k;++j)
		{
			dp2[i][j] |= dp2[i+1][j];
			if(j>=a[i]) dp2[i][j] |= dp2[i+1][j-a[i]];
		}
	} 
//	cout<<dp2[5][2]<<"!\n";
	for(int i=1;i<=n;++i)
	{
//		cout<<i<<":"<<a[i]<<"?\n";
		vector<int> l,r; 
		for(int j=0;j<=k;++j)
		{
			if(dp[i-1][j]) l.push_back(j);
			if(dp2[i+1][j])
			{
				r.push_back(j);
			}
		}
		bool flag = 0;
		int idx1 = lower_bound(l.begin(),l.end(),k-a[i]) - l.begin();
		int idx2 = lower_bound(r.begin(),r.end(),k-a[i]) - r.begin();
		if(idx1!=l.size() && l[idx1] <= k-1) 
		{
			flag = 1;
//			cout<<i<<":"<<"?\n";
		}
		if(idx2!=r.size() && r[idx2] <= k-1) 
		{
			flag = 1;
//			cout<<i<<" "<<idx2<<":"<<r[idx2]<<"?\n";
//			cout<<i<<":"<<"??\n";
//			for(auto item:r) cout<<item<<"???\n";
		}
//		cout<<i<<":"<<flag<<"?\n";
		for(int j=l.size()-1;!flag && j>=0;--j)
		{
			int now = l[j];
			int idx = lower_bound(r.begin(),r.end(),k-a[i]-l[j]) - r.begin();
			if(idx!=r.size() && now + r[idx] <= k-1) flag = 1;
		}
		if(flag) ans ++ ;
	}
	cout<<ans;
    return 0;
}
/*
6 20
10 4 3 10 25 2

10 4 3 10 2
*/

前綴和版:文章來源地址http://www.zghlxwxcb.cn/news/detail-714804.html

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 5002;
int n,m,k,T;
bool dp[N][N];
bool dp2[N][N];
int b[N];
int a[N];
int sum[N][N]; //從n到i,<=j的方案數(shù),方便統(tǒng)計方案 
int main(void)
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>m>>k;
    n = 0;
    int ans = 0;
    for(int i=1;i<=m;++i)
    {
    	cin>>b[i];
    	if(b[i]>=k) ans++;
    	else a[++n] = b[i];
	}
	//從前向后dp、從后向前dp,求前i個數(shù)能否湊出j、從n到i能否湊出j 
	dp[0][0] = 1;
	dp2[n+1][0] = 1;
	for(int i=1;i<=n;++i)
	{
		for(int j=0;j<=k;++j)
		{
			dp[i][j] |= dp[i-1][j]; 
			if(j>=a[i]) dp[i][j] |= dp[i-1][j-a[i]];
		}
	}
	for(int i=n;i>=1;--i)
	{
		for(int j=0;j<=k;++j)
		{
			dp2[i][j] |= dp2[i+1][j];
			if(j>=a[i]) dp2[i][j] |= dp2[i+1][j-a[i]];
			if(j==0) sum[i][j] = 1;
			else sum[i][j] = sum[i][j-1] + dp2[i][j];
		}
	} 
	//問題轉(zhuǎn)化為對于每個a[i],如果a[i]>=k,那么肯定符合,因為存在一種只有它自己的方案,它不可或缺
	//;否則的話,如果存在某種方案坐落在[k-a[i],k-1]之間,a[i]同樣符合 
	for(int i=1;i<=n;++i) //枚舉當前的數(shù) 
	{
		
		for(int j=0;j<k;++j) //枚舉前i-1個數(shù)的和
		{
			if(!dp[i][j]) continue;
			int l = k-a[i]-j;
			int r = k-1-j;
			
			int cnt = 0;//右邊需要湊的方案數(shù)量 
			if(j>=k-a[i]) //l<=0
			{
				//j+x<=k-1, x<=k-1-j
				cnt = sum[i+1][r]; //右邊,<=k-1-j的方案數(shù) 
			}
			else //l>0
			{
				//j+x>=k-a[i],x>=k-a[i]-j
				//j+x<=k-1,x<=k-1-j
				//求k-a[i]-j<=x<=k-1-j的方案數(shù)
				cnt = sum[i+1][r] - sum[i+1][l-1]; 
			}
			if(cnt>0)
			{
				ans ++ ;
				break;
			}
		} 
	}
	cout<<ans;
	return 0;
}
/*
6 20
10 4 3 10 25 2
*/

到了這里,關(guān)于有一些東西必不可少(前后背包+二分/前綴和優(yōu)化)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【AI繪畫】Stablediffusion必不可少的使用方法之關(guān)鍵詞(2)

    【AI繪畫】Stablediffusion必不可少的使用方法之關(guān)鍵詞(2)

    ? ? ? ? 我相信很多已經(jīng)下載好Stablediffusion或者midjourney軟件的朋友,第一反應(yīng)都是看著滿屏看不懂的各種選項發(fā)懵吧,而當你穩(wěn)住心神,準備在文生圖或者圖生圖這兩塊基礎(chǔ)操作力大顯身手,想創(chuàng)造出屬于自己的藝術(shù)設(shè)計之時,難免會對著下面這個框框陷入兩難:我應(yīng)該填什

    2024年02月02日
    瀏覽(28)
  • Qt | QWidget 自定義消息處理函數(shù)(捕獲調(diào)試信息),調(diào)試和測試必不可少

    # 01 函數(shù)qInstallMessageHandler ????qInstallMessageHandler?是 Qt 中用于安裝自定義消息處理函數(shù)的函數(shù)。在 Qt 應(yīng)用程序中,可以使用?qInstallMessageHandler?來接管 Qt 的消息輸出,以便自定義消息的處理和記錄。 #02? myMessageOutput(QtMsgType type, const QMessageLogContext context, const QString msg)? ??

    2024年03月22日
    瀏覽(24)
  • 【npm link】Node命令中的npm link命令的使用,還有CLI全局命令的使用,開發(fā)命令行工具必不可少的部分

    【npm link】Node命令中的npm link命令的使用,還有CLI全局命令的使用,開發(fā)命令行工具必不可少的部分

    ?? 作者簡介:一名大四的學生,致力學習前端開發(fā)技術(shù) ??個人主頁:夜宵餑餑的主頁 ? 系列專欄:NodeJs ??學習格言:成功不是終點,失敗也并非末日,最重要的是繼續(xù)前進的勇氣 ????前言: 本文是關(guān)于Node命令中的npm link命令的詳細使用,還有腳手架的背后原理,如

    2024年01月16日
    瀏覽(36)
  • BLE調(diào)制與解調(diào)的一些東西

    BLE調(diào)制與解調(diào)的一些東西

    BLE是GFSK的IQ調(diào)制 所謂IQ調(diào)制,就是利用IQ兩個分量序列去控制兩路正交信號,I和Q兩個序列可以是任意數(shù)字,也可以是符合某些規(guī)律的序列。 總的原理公式就是: 看這篇博客的圖片,很清楚。 https://blog.csdn.net/qq_41019681/article/details/111305603 想要更深入的理解,就看這篇,別人寫

    2024年02月02日
    瀏覽(17)
  • php使用chatGPT生成一些東西做一個記錄

    好久沒寫了,這么長時間都去坐一些自己感興趣的事情去了。 之前使用chatgpt-3,效果一直不咋好,這里我們來說說各個版本區(qū)別 gpt-3收費成本可以接受,生成的內(nèi)容對話有點不太聰明的樣子 git-3.5-turbo收費相對來說低,生成文本質(zhì)量還是蠻高的,雖然有可能存在一點廢話,但是

    2024年02月15日
    瀏覽(20)
  • 碼一些有用的東西網(wǎng)站的域名被攔截怎么辦? 教你快速解除各種攔截

    碼一些有用的東西網(wǎng)站的域名被攔截怎么辦? 教你快速解除各種攔截

    今天跟大家講解一下網(wǎng)站域名被攔截怎么辦?怎么去解決,相信這個問題一直都是很多人的困惑吧,其實大部分行業(yè)的攔截都是可以進行處理的,針對新人來講可能還不知道什么網(wǎng)站域名被攔截,下面我詳細來講解下。 什么是網(wǎng)站域名攔截? 網(wǎng)站攔截就是別人投訴了你的網(wǎng)

    2023年04月19日
    瀏覽(26)
  • 個人對前后端分離的一些看法

    內(nèi)容簡介:前端開發(fā)過程中能完全不依賴后端的才是真正的前后端分離指的是工作過程中,前端的的代碼中往往會摻雜一些后端的邏輯。后端返回了一個json對象 前端開發(fā)過程中能完全不依賴后端的才是真正的前后端分離 指的是工作過程中,前端的的代碼中往往會摻雜一些后

    2024年02月13日
    瀏覽(14)
  • 貝塞爾曲線 PH曲線 C曲線 B樣條 NURBS樣條曲線 三次Cardinal樣條曲線對比 也涉及到不同曲線加速度的一些東西,不過有待細化

    貝塞爾曲線 PH曲線 C曲線 B樣條 NURBS樣條曲線 三次Cardinal樣條曲線對比 也涉及到不同曲線加速度的一些東西,不過有待細化

    本文很多直接截圖論文的,因為不需要重復造輪子,對比也只是為了選擇更佳的路徑規(guī)劃曲線,對比于B曲線,時間不夠,概括會有所疏漏,下表是曲線的對比表格,看完可以直接看下面,也涉及到不同曲線加速度的一些東西,不過有待細化,2022/3/17后來上了高等工程數(shù)學,如

    2024年02月03日
    瀏覽(22)
  • mac東西拷不進硬盤怎么回事 mac東西拷不進硬盤怎么辦 mac硬盤讀不出來怎么解決 mac拷貝不了東西到u盤

    mac東西拷不進硬盤怎么回事 mac東西拷不進硬盤怎么辦 mac硬盤讀不出來怎么解決 mac拷貝不了東西到u盤

    有時候我們在使用mac的過程中,可能會遇到一些問題,比如mac東西拷不進硬盤。這是一種很常見的情況,但是會影響我們的工作和生活。那么,mac東西拷不進硬盤是怎么回事呢?mac東西拷不進硬盤又該怎么辦呢?本文將為你解答這兩個問題。 mac東西拷不進硬盤的原因可能有以

    2024年02月19日
    瀏覽(90)
  • @Value是個什么東西

    @Value是個什么東西

    對注解不了解的可以看一下: Java注解,看完就會用 首先我們要明確: @Value 是 Spring 框架的注解。 它有什么作用呢? @Value 通過注解將 常量 、 配置文件中的值 、其他 bean的屬性值 注入到變量中,作為變量的初始值。 顧名思義,就是把一個寫死的值賦給對應(yīng)變量,形式如下

    2024年02月03日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包