度度熊的午飯時光

2021-08-05 19:33:17 字數 1693 閱讀 1501

這一道題就是典型的揹包dp。

我們可以設一下bz[i]這個布林陣列為是否能剛好用掉i元錢,然後用乙個輔助布林陣列,bz2[i][j]表示在剛好花掉i元錢,最優方案的時候第j個菜是否會被選中。

接著我們便會得到乙個轉移方程。

如果bz[i-c[j]]的方案比bz[i]好,

bz2[i]=bz2[j]。

但問題是,我們怎麼判斷bz[i-c[j]]的方案是否會比bz[i]好呢?

首先我們先判斷一下他們的分數(注意,bz[i-c[j]]的所有分數和加起來後還要加是s[j]!),如果分數相同,我們就看一下他們的編號和(也別忘了加j!)如果編號和相同,我們就看一下他們的字典序是否相等,哪個更小就選哪乙個。

最後選擇所有方案中最優的方案。

#include

#include

using

namespace

std;

bool bk[1100][110],bz[1100];

int s[1100],c[1100];

int b,n;

int sum7[110],sum8[110];

int ans3[110];

int mymin(int x,int y)

bk[cost][id]=true;

return ;

}if(bk[cost-c[id]][id]==true)

int sum=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0;

for(int i=1;i<=n;i++)

if(bk[cost][i]==true)

}sum5++;

sum7[sum5]=id;

bool bk2=false;

if(sum+idtrue;

if(sum+id==sum2)

if(sum7[i]>sum8[i])

}if(bz2==true&&sum5>sum6)

}if(sum3+s[id]>sum4||(bk2==true&&sum3+s[id]==sum4))

bk[cost][id]=true;

}return ;

}int main()

memset(bz,false,sizeof(bz));

memset(bk,false,sizeof(bk));

bz[0]=true;

for(int i=1;i<=n;i++)}}

int ans=-1,ans2;

for(int i=0;i<=b;i++)

}bool bk2=false;

if(sum9==ans)

if(bk[ans2][j]==true)

}if(sumtrue;

if(sum==sum2)

if(sum7[j]>sum8[j])

}if(bz2==false&&sum5>sum6)}}

if(sum9>ans||(sum9==ans&&bk2==true))

}printf("case #%d:\n",++t2);

printf("%d %d\n",ans,ans2);

int len=0;

for(int i=1;i<=n;i++)

}for(int i=1;i<=len;i++)

}return

0;}

度度熊回家

度度熊回家 時間限制 1秒 空間限制 32768k 乙個數軸上共有 n個點,第乙個點的座標是度度熊現在位置,第 n 1個點是度度熊的家。現在他需要依次的從 0號座標走到 n 1號座標。但是除了 0號座標和 n 1號座標,他可以在其餘的 n 2個座標中選出乙個點,並直接將這個點忽略掉,問度度熊回家至少...

度度熊回家

輸入乙個正整數n,n 50。接下來n個整數表示座標,正數表示x軸的正方向,負數表示x軸的負方向。絕對值小於等於100輸出描述 輸出乙個整數表示度度熊最少需要走的距離。輸入例子 4 1 4 1 3輸出例子 4思路 這題的關鍵在如何找到可以去除的那一點。考察連續的三個點,若三點的值都是遞增的,如,這樣,...

度度熊回家 (模擬)

思路 先計算出從第0個座標到第n 1個座標的距離,然後列舉忽略 1 n 2 的點,直接可以得到需要走的距離。複雜度o n 當然暴力列舉再重新計算也是可以ac的,複雜度o n2 ac include include using namespace std define inf 0x3f3f3f3f c...