题目见网址http://lx.lanqiao.cn/problem.page?gpid=T2893
怪我太菜了,这居然是一道dp题。。。`
研究了广大友友的代码,整明白了。感谢广大友友的帮助。
#include <iostream>
#include <algorithm>
using namespace std;
//dp[i][j],目前放了前i个砝码,j代表目前取的前i个砝码的总重量
//思路就是连续遍历j,然后标记状态.
bool dp[105][100003]={0};
int main()
{
int n;
cin >> n;
int a[n];
int sum=0;
int ans = 0;
for (int i = 0; i < n;i++)
{
cin >> a[i];
sum += a[i];
}
//初始化dp数组
dp[0][a[0]] = 1;
for (int i = 1; i < n;i++)
{
for (int j = 1; j <= sum; j++)
{
dp[i][j] = dp[i - 1][j];//复制上一个状态
}
dp[i][a[i]] = 1;
for (int j = 1; j <= sum;j++)
{
if(dp[i-1][j])
{
dp[i][j + a[i]] = 1;
dp[i][abs(j - a[i])] = 1;
}
}
}
for (int j = 1; j <= sum;j++)
{
if(dp[n-1][j])
ans += dp[n - 1][j];
}
cout << ans<<endl;
return 0;
}
bool类型的dp[i][j]数组,i指的是用了前i个砝码,然后j就是前i个砝码的重量,一开始把那些砝码的重量存在了一个数组a[i]里,所以就是填满这个二维数组,然后看最后一行有多少个1,就是能称出的重量有多少种。这里有点哈希的思想,不用担心重了的问题。dp数组的含义至关重要了呜呜呜。