思路:
f[i][j] : 对第i个物品,是否可以称出第j个重量
因此最后的结果直接对最后一个砝码遍历,数有几个true
每个砝码都有选、不选两种情况,而选之后又有放左边和右边的选择,即+ 或者 -
因此状态转移方程为: f[i][j] = f[i - 1][j] || f[i - 1][abs(j - nums[i])] || f[i - 1][j + nums[i]]
注意一定要初始化!f[0][0] = true
代码:
#include <iostream>
#include<algorithm>
using namespace std;
int n;
const int N = 110;
int nums[N];
bool f[N][200010];
int m = 0;
int main()
{
cin >> n;
for(int i = 1;i <= n;i++) {
cin >> nums[i];
m += nums[i];
}
f[0][0] = true;
for(int i = 1;i <= n;i++){
for(int j = 0;j <= m;j++){
f[i][j] = f[i - 1][j] || f[i - 1][abs(j - nums[i])] || f[i - 1][j + nums[i]];
}
}
int res = 0;
for(int i = -m;i <= m;i++){
if(f[n][i]) res ++;
}
cout << res - 1;
return 0;
}
以上是本文全部内容,如果对你有帮助点个赞再走吧~ ₍˄·͈༝·͈˄*₎◞ ̑̑