题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <stdio.h> #include<string.h> int main() { int n; scanf("%d\n", &n); int m[12] = {0};//输入数组放大一些一边测试 for (int i = 1; i <= n; i++) { scanf("%d", &m[i]); } int num[12] = {0},k = 0; for (int i = 1; i <= n; i++) { scanf("%d", &num[i]); k = k+num[i]*m[i]; } int dp[12][200000];//dp[砝码种类][总质量] for (int i = 0; i<=n; i++) { dp[i][0] = 1;//不放砝码算一种摆法 } for (int i = 1; i<=n; i++) { for (int j = 1; j <= k; j++) { if (dp[i-1][j] == 1) { dp[i][j] = 1;//如果只有一种砝码的情况能摆出这个质量,那么再加一种也能摆出这个质量(加的那种不上称) continue; } for (int x = 1; x<=num[i]; x++) { if (j>=x*m[i]) {//判断能不能再加一个当前编号的砝码 if (dp[i-1][j-x*m[i]] == 1) { dp[i][j] = 1; break; } } } } } int kinds=0; for(int i=0;i<=k;i++) { kinds+=dp[n][i]; //只遍历dp砝码数量为n的数组,加出值量种类数 } printf("%d\n",kinds); return 0; }