描述
一个旅行者有一个最多能装 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;
}