使用动态规划的原理,算出砝码的总重量,根据重量建立相应长度的两个数组向量,对于每一个砝码,从重量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")