有乙個箱子容量為v(正整數,o≤v≤20000),同時有n個物品(30),每個物品有乙個體積 (o≤正整數≤10000)。要求從 n 個物品中,任取若千個裝入箱內。
方法1
設 f [ i ] 為不超過 i 的最大值,就可以看做揹包。即費用等於價值。
得 f [ j ] = max
#includeusing namespace std;
int read()
int f[20005],a[35];
int main()
方法2
設 f [ i ] 為bool,為真就是能加成 i ,反之亦然。
得if( f [ j - a [ i ] ] == true ) f [ j ]=true;最後從 v 往前找,第乙個為真的。
f[0]=1;
for(i=1;i<=n;i++)
a[i]=read();
for(i=1;i<=n;i++)
for(j=v;j>=a[i];j--)
if(f[j-a[i]]==1)
f[j]=1;
for(i=v;i>=0;i--)
if(f[i])
不要在意箱子裝不裝得下
同理
設 f [ i ] 為不小於 i 的最小值。防止第 j 個加不到,可能把f [ j + 1 ]的值賦上去。(因為f [ j + 1 ] > j +1 ,所以f [ j + 1 ] > j。)
注意:陣列需要先初始化。
j > a[ i ]時f [ j ]= min
else
f [ j ]=min ( f [ j ] , a[ i ] )
#includeusing namespace std;
int read()
int f[20005],a[35];
int main()
方法2同理
注意:因為是大於 v ,所以迴圈時,大於 v的一些範圍也要迴圈。
f[0]=1;
for(i=1;i<=n;i++)
a[i]=read();
for(i=1;i<=n;i++)
for(j=v+a[i];j>=a[i];j--)
if(f[j-a[i]]==1)
f[j]=1;
for(i=v;i<=v+10000;i++) //a[i]最大為10000
if(f[i])
迷宮問題及延伸
迷宮問題 問題描述 給定乙個m n的迷宮圖,求所有從指定入口 到出口的路徑。假設迷宮圖如下圖所示 其中m 6,n 6,含 外圍加上一圈不可走的方塊,這樣做的目的是避免在查詢時 出界 迷宮由方塊構成,空白方塊表示可以走的通道,帶 陰影方塊表示不可走的障礙物。要求所求路徑必須是簡單路徑,即在求得的路徑上...
struct sockaddr定義及延伸
跟蹤看一下 strcut sockaddr 是怎麼定義的,這個定義在 usr include bits socket.h裡 引用 struct sockaddr 由上可見,sockaddr 結構體的第乙個成員是乙個巨集定義,再來看一下這個巨集定義 在 usr include bits sockadd...
問題A 裝箱問題
思路 思路 根據演算法筆記上01揹包問題的一維形式改編,就僅僅是把每件物品的價值改為1,再未做其他修改,後來發現不行 const int maxn 1001 int dp maxn int w maxn int main for int i 0 i參照別人的答案,進行的思考 首先,狀態轉移方程 dp...