日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

求连续子数组的最大和

發(fā)布時(shí)間:2025/6/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求连续子数组的最大和 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題描述:

設(shè)有1g,2g,3g,5g,10g,20g的砝碼各若干枚(其總重≤1000g),要求:

輸入:

a1???a2???a3???a4???a5???a6(表示1g砝碼有a1個(gè),2g砝碼有a2個(gè),......20g砝碼有a6個(gè))

輸出:

Total=N (N表示用這些砝碼能稱出的不同重量的個(gè)數(shù),但不包括一個(gè)砝碼也不用的情況)

輸入樣例:1??1??0???0???0???0

輸出樣例:Total=3,表示可以稱出1g,2g,3g三種不同的重量

動(dòng)態(tài)規(guī)劃求解:

從砝碼1開始分析,假設(shè)前i個(gè)砝碼能稱出的不同重量為Q[i],那么Q[i]一定是這樣計(jì)算出來(lái)的:在Q[i-1]的基礎(chǔ)上,對(duì)Q[i-1]個(gè)不同的重量,分別添加k個(gè)砝碼i,再添加的過(guò)程中除去重復(fù)情況。

假設(shè):w[N]表示N個(gè)不同重量的砝碼(例子中N=6),w[0~N-1]。

????? c[N]表示N個(gè)不同砝碼相應(yīng)的數(shù)量,c[1~N]。

則:Q[i] = (Q[i-1] + k*w[i])-添加過(guò)程中重復(fù)的個(gè)數(shù)。其中0=<k<=c[i]。

定義一個(gè)輔助布爾型數(shù)組visit[M+1],這里的M是例子中的1000,表示最大重量不超過(guò)M。

visit[j]=1表示,重量為j的情況已經(jīng)存在,否則表示重量為j的情況還未出現(xiàn)。其中visit[0]作為一個(gè)多余空間存在,可以作為一個(gè)臨時(shí)變量。最后遍歷visit[1~M],統(tǒng)計(jì)1的個(gè)數(shù)就得到不同重量的個(gè)數(shù)。

通過(guò)這個(gè)輔助數(shù)組,就可以除去重復(fù)情況,實(shí)現(xiàn)如下:


?

[cpp]?view plaincopy
  • 1?#include?<iostream>??
  • ?2?using?namespace?std;??
  • ?3?#define?N?6??
  • ?4?#define?M?1000??
  • ?5?int?w[N]={1,2,3,5,10,20};??
  • ?6?int?c[N]={0};??
  • ?7?int?visit[M+1]?=?{0};??
  • ?8???
  • ?9?int?weight_count()??
  • 10?{??
  • 11?????????int?i?=?0;??
  • 12?????????int?j?=?0;??
  • 13?????????int?total?=?0;??
  • 14?????????int?count?=0;??
  • 15???
  • 16?????????visit[0]?=?w[0]*c[0];//visit[0]用于每添加一個(gè)砝碼時(shí)遍歷的結(jié)束位置??
  • 17?????????for(i?=?1;i<=c[0];i++)??
  • 18?????????????????visit[w[0]*i]?=?1;//初始化visit[1~c[0]],表示已經(jīng)添加了砝碼1??
  • 19?????????for(i?=?1;i<N;i++)??
  • 20?????????{??
  • 21?????????????????int?m?=?visit[0];??
  • 22?????????????????for(int?k?=?1;k<=c[i];k++)??
  • 23?????????????????{??
  • 24?????????????????????????for(j?=?0;j<=m;j++)??
  • 25?????????????????????????{??
  • 26?????????????????????????????????if(j+?k*w[i]>M)??
  • 27?????????????????????????????????????????break;??
  • 28??????????????????????????????????if(visit[j]?==?1?&&?visit[j?+?k*w[i]]?!=?1?||?j==0)??
  • 29??????????????????????????????????{??
  • 30?????????????????????????????????????????visit[j?+?k*w[i]]?=?1;??
  • 31?????????????????????????????????????????total?=?j+k*w[i];??
  • 32??????????????????????????????????}??
  • 33?????????????????????????}??
  • 34?????????????????}??
  • 35?????????????????visit[0]?=?total;??
  • 36?????????}??
  • 37?????????for(i?=?1;i<=M;i++)??
  • 38?????????{??
  • 39?????????????????if(visit[i]==1)??
  • 40?????????????????{??
  • 41?????????????????????????cout?<<?i?<<?"?";??
  • 42?????????????????????????count?++;??
  • 43?????????????????}??
  • 44?????????}??
  • 45?????????return?count;??
  • 46???
  • 47?}??
  • 48?int?main()??
  • 49?{??
  • 50?????????int?i?=?0;??
  • 51?????????for(i?=?0;i<N;i++)??
  • 52?????????????????cin?>>c[i];??
  • 53?????????int?count?=?weight_count();??
  • 54?????????cout?<<?count?<<?endl;??
  • 55?}??
  • 總結(jié)

    以上是生活随笔為你收集整理的求连续子数组的最大和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。