Backpack
给定N个物品,重量分别为正整数A0,A1,…,AN-1
一个背包最大承重是正整数M
最多能带走多重的物品
例子:
输入:
4个物品,重量为2,3,5,7 背包最大承重是11
输出:
10
01背包问题
#include <cstdio>
#include <algorithm>
using namespace std;
int d[1000], w[1000], n, m;
int main() {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) {
scanf("%d", &w[i]);
}
for(int i = 0; i < n; i++) {
for(int j = m; j >= w[i]; j--) {
d[j] = max(d[j], d[j - w[i]] + w[i]);
}
}
// for(int i = 0; i <= m; i++) {
// printf("%d ", d[i]);
// }
printf("%d", d[m]);
return 0;
}
2、
给定N个正整数:A0,A1,…,AN-1
一个正整数target
求有多少种组合加起来是target
每个Ai只能用一次
例子:
输入:
A=1,2,3,3,7
target = 7
输出:
2(7=7,1+3+3=7)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int d[1000], w[1000], n, m;
int main() {
int res = 0;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) {
scanf("%d", &w[i]);
}
memset(d, 0, sizeof(d));
for(int i = 0; i < n; i++) {
for(int j = m; j >= w[i]; j--) {
if(j == m && d[j - w[i]] + w[i] == m) res++;
d[j] = max(d[j], d[j - w[i]] + w[i]);
}
}
// for(int i = 0; i <= m; i++) {
// printf("%d ", d[i]);
// }
// printf("%d\n", d[m]);
printf("%d\n", res);
return 0;
}
3、
给定N个正整数:A0,A1,…,AN-1
一个正整数target
求有多少种组合加起来是target
每个Ai可以用多次
例:
输入:
A=1,2,4
target = 4
输出:
6(1+1+1+1,2+2,1+1+2,1+2+1,2+1+1,4)
任何一个正确的组合中,所有物品的总重量是target
如果最后一个物品的重量是K,则前面的物品总重量是target - K
状态方程:
d[i] = d[i - a0] + d[i - a1] +…+d[i-aN-1]
#include <cstdio>
#include <algorithm>
using namespace std;
int d[1000], a[1000], n, k;
int main() {
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
d[0] = 1;
for(int i = 1; i <= k; i++) {
for(int j = 0; j < n; j++) {
if(i >= a[j]) {
d[i] += d[i - a[j]];
}
}
}
printf("%d", d[k]);
return 0;
}
来源:CSDN
作者:ChenXiLian_
链接:https://blog.csdn.net/ChenXiLian_/article/details/104113712