主題:揹包
揹包是利用動態規劃
主要形式:
1.一維形式
int v[100],n,w[100],dp[100];
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++){
for(int j = m; j >= w[i]; j--){
dp[j] = max(dp[j],dp[j - w[i]]+v[i]);
printf("%d", dp[m]);//從大到小保持不會爆
2.二維形式
函式實現 0-1 揹包
#include
#include
using namespace std;
int v[3500][15000];//在main函式外面能把一/二維陣列開的更大一些
int knapsack(int n, int m, int *w, int *v){
for(int i = 0'; i < n; i++){
v[0][i] = 0;
for(int i = 0; i < m; ++){
v[i][0] = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m]; j--){
if(j < w[i]){
v[i][j] = v[i-1][j];
else {
v[i][ j] =max(v[i-1][j],v[i-1][j+w[i]]+v[i]);
int j = m;
for(int i =n ;i > 0; i--){
if(v[i][j] > v[i][j-1]){
j = j - w[i];
else ;
return v[n][m];
int main(){
itn n, m,w[500],v[500];
memset(v,0,sizeof(v));
while(~scanf("%d%d", &n,&m)){
for(int i = 1; i <= n; i++){
scanf("%d%d", &w[i], &v[i]);
printf("%d\n", ksnapsack(n,m,w,v));
return 0;
3.揹包不一定為+,還可變形為×
for(int i = 1; i <= n ; i++)
for(int j = m; j >= w[i] ; j--)
.... = max( , )
只是為了得到最接近m的組合
4.二維陣列可以用下標來表示乙個平衡狀態
如果i下標會小於零的話,重新定義乙個零點.
例定義7500為零點.
dp[0][7500] = 1;//m表示砝碼的個數,n表示距離中心的距離的個數
for(int i = 1; i <=n; i++){
for(int j = 1; j <= m; j++){
for(int k = 0; k <= 15000; k++){
dp[i][k + w[i]*v[j]]+=dp[i-1][k];
printf("%d", dp[m][7500]);
5.最長不下降子串行
一.n*2複雜度的一般做法(大於10000個元素時不再適用)
#include
int main(){
int num[100],a[100];
int n;
scanf("%d", &n)
for(int i = 0; i <= n; i++){
scanf("%d", &a[i]);
for(int i = 0; i <= n; i++){
num[i] = 1;
for(int j = 0; j < i; j++){
if(a[i] > a[j]&&num[j]+1>num[i]){
num[i] = num[j] +1;
int max = 0;
for(int i = 0; i < n; i++){
if(max < a[i])
max = a[i];
printf("%d\n", max);
return 0;
二.二分法 複雜度n*logn
int a[10000],num[10000];
int find(int len ,int n){
int left = 1, right = len;
int mid;
whie(left<=right){
if(a[mid] = n) return mid;
else if(a[mid] > n) right = mid - 1;
else if(a[mid] < n) left = mid + 1;
return left;
int main(){
int n;
while(~scanf("%d", &n)){
for(itn i = 1; i <= n; i++){
scanf("%d", a[i]);
num[1] = a[1];
int len = 1;
for(int i = 1; i <= n; i++){
int j = find(len ,a[i]);
num[j] = a[i];
if(j > len)
len = j;
printf("%d\n", len);
return 0;
集訓第三天,打卡
今天訓練賽自己價效比搞了個k題,相對較水,也算做了點貢獻吧。有一條概率dp,戴老闆秒切,膜啊,覺得不錯,所以寫了來。題意是乙個棋盤,在上面隨機放旗子,問所有的列和行上至少有乙個棋子的期望是多少。顯然的概率dp,dp i j k 表示放了i個棋子,覆蓋了j行,k列的概率。當前狀態都可以由放i 1個棋子...
第三天 11月2日
今天發過來乙個版本發布內容表,主要是本月重要的幾個版本的更新內容及更新時間 都在星期三例行維護時間 該錶主要是由測試與產品參與協商出來的。對於其他配置的小更新,會在其他時間例行維護時進行更新。對於代主程乙個主要任務就是 催 催資源,催產品需求,崔策劃案子等等,這就需要主程能夠明確所需的各種資源與需求...
XTU集訓第三天16 7 19
上午把訓練題專案管理給a了。原來vector還能這麼用啊 b 專案管理 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 我們建造了乙個大專案!這個專案有n個節點,用很多邊...