動態規劃之0 1 揹包問題

2021-07-22 14:08:43 字數 1904 閱讀 7390

問題描述:有n種物品,每種只有乙個。第i種物品的體積為vi,重量為wi。挑選若干物品裝到乙個容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡可能大。

ps:容量對應體積

1<=n<=100, 1<=vi<=c<=10000,1<=wi<=10^6

#include 

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

// input

// 1

// 3 10

// 4 3 5

// 10 1 6

//// output

// case #1: 16

int n; // 物品個數

int cpacity; //揹包總容量

int ans; //所求的最大重量

int weights[1005]; //物品的重量陣列

int volumes[1005]; //物品的體積陣列

int dp[1005][1005]; //計算最大重量的動態規劃陣列

void solve1()

}} ans = dp[1][cpacity];

} void solve2()

}} ans = dp[n][cpacity];

} void sovle3()

}} ans = f[cpacity];

} int main()

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

// solve2();

sovle3();

cout

<< "case #"

<< t++ << ": "

<< ans << endl;

} return

0;}

// 0-1揹包問題

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

int n;

ll t;

int songs[51];

int main()

ll res[t];

ll totallengths[t];

memset(res, -1, sizeof(res));

memset(totallengths, 0, sizeof(totallengths));

// res[j] 代表歌曲總時長剛好為j的歌曲最多個數

res[0] = 0;

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

// ans = res[t - 1];

for (ll k = t - 1; k >= 1; k--)

}totallen = totallen + 678;

ans += 1;

printf("case %d: %lld %lld\n", casen++, ans, totallen);

} return

0;}

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...