描述
一個旅行者有一個最多能裝 M 公斤的揹包,現在有 n 件物品,它們的重量分別是W1,W2,...,Wn,它們的價值分別爲C1,C2,...,Cn,求旅行者能獲得最大總價值。
格式
輸入格式
第一行:兩個整數,M(揹包容量,M≤200)和N(物品數量,N≤30); 第2..N+1行:每行二個整數Wi,Ci,表示每個物品的重量和價值。
輸出格式
僅一行,一個數,表示最大總價值。
樣例
輸入樣例
10 4
2 1
3 3
4 5
7 9
輸出樣例
12
限制
時間限制: 1000 ms
內存限制: 65536 KB
//深搜回溯
#include<bits/stdc++.h>
using namespace std;
struct goods{
int w;
int c;
} g[35];
int sumC=0, tmp=0, sumW=0, m, n;
void dfs(int k) {
if (sumW > m) {
return;
}
if (tmp > sumC) {
sumC = tmp;
}
for (int i=k; i<n;i++){
sumW += g[i].w;
tmp += g[i].c;
dfs(i+1);
tmp -= g[i].c;
sumW -= g[i].w;
}
}
int main()
{
scanf ("%d %d", &m, &n);
for (int i=0; i<n; i++) {
scanf ("%d %d", &g[i].w, &g[i].c);
}
for (int j=0; j<n; j++){
tmp = 0;
dfs(j);
}
printf ("%d", sumC);
return 0;
}
//動規
#include<bits/stdc++.h>
using namespace std;
struct goods{
int w;
int c;
} g[35];
int main()
{
int m, n, f[35][250]; //f[i][j]中,i表示第i個物件,j表示剩下多少空間
scanf ("%d %d", &m, &n);
for (int i=1; i<=n; i++) {
scanf ("%d %d", &g[i].w, &g[i].c);
}
for (int i=1; i<=n; i++) {
for (int j=m; j>0; j--) {
if (g[i].w > j) {
f[i][j] = f[i-1][j]; //當第i件太重時,選擇前面的i-1件
} else {
f[i][j] = max(f[i-1][j],
f[i-1][j-g[i].w]+g[i].c); //放與不放在於價值是否最大
}
}
}
printf ("%d", f[n][m]);
return 0;
}