使用动态规划的原理,算出砝码的总重量,根据重量建立相应长度的两个数组向量,对于每一个砝码,从重量0开始遍历,如果当前的重量减去此砝码的重量对应的重量存在,则当前重量标记为存在,否则复制之前的数组值,遍历完砝码后,对应的数组中1的数量就是重量组合的数量。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
int weight[n];
int num[n];
int sum = 0;
for (int i = 0; i < n; i++) {
cin >> weight[i];
}
for (int i = 0; i < n; i++) {
cin >> num[i];
sum += num[i] * weight[i];
}
vector<vector<int>> dp(2, vector<int>(sum + 1, 0));
dp[0][0] = 1;
dp[1][0] = 1;
int a = 0;
int b = 1;
for (int i = 0; i < n; i++) {
for (int j = 1; j <= num[i]; j++) {
for (int k = 0; k < weight[i]; k++) {
dp[b][k] = dp[a][k];
}
for (int k = weight[i]; k <= sum; k++) {
dp[b][k] = dp[a][k - weight[i]] == 1 ? 1 : dp[a][k];
}
int temp = a;
a = b;
b = temp;
}
}
int ans = 0;
int temp = 0;
for (int i = 0; i < 2; i++) {
for (int j = 0; j <= sum; j++) {
if (dp[i][j] == 1) {
temp++;
}
}
ans = max(ans, temp);
temp = 0;
}
cout << ans;
return 0;
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号