题目描述
题目分析
动态规划解决。建立状态,数组元素为0或1,代表只用前个砝码能否称出重量。
设个砝码重量为,则第状态转移方程为:
我的代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
int n;
bool dp[101][100002];
int main(){
//初始化
cin >> n;
int i;
int j;
for(i=0;i<=n;i++){
for(j=0;j<=100001;j++){
dp[i][j] = 0;
}
}
for(i=0;i<=n;i++){
dp[i][0] = 1;
}
//DP
for(i=1;i<=n;i++){
int k;
cin >> k;
for(j=1;j<=100000;j++){
if(j-k>=0){
dp[i][j] += dp[i-1][j-k];
}
if(k-j>=0){
dp[i][j] += dp[i-1][k-j];
}
if(k+j<=100000){
dp[i][j] += dp[i-1][k+j];
}
dp[i][j] += dp[i-1][j];
}
}
//getAnswer
int ans = 0;
for(j=1;j<=100000;j++){
ans += dp[n][j];
}
cout<<ans;
return 0;
}