资源限制
时间限制:1.0s 内存限制:256.0MB


#include<iostream>
#include<cmath>
using namespace std;
const int N = 110, M = 1e5 + 10;
int n, sum, w[N];
int f[N][M];//f[i][j]表示用前i个砝码是否能称量j重量,1为可,0为不能
//显然易知左物右码
//对于第i个砝码,有三种可能,即,不选,放左边,放右边。只要三者其中之一是可行,那么f[i][j]即可行
//不选 f[i][j]=f[i-1][j]
//放左边 f[i][j]=f[i-1][j+w[i]]
//放右边 f[i][j]=f[i-1][abs(j-w[i])] abs取绝对值防止下标为负数
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
sum += w[i];
}
f[0][0] = true;//显然不用砝码便能称量0重量
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= sum; j++)
{
f[i][j] = f[i - 1][j] || f[i - 1][j + w[i]] || f[i - 1][abs(j - w[i])];//三种情况有一种可行即可行
}
}
int ans = 0;
for (int j = 1; j <= sum; j++)
{
if (f[n][j])ans++;//在n个砝码和的范围内,统计可行方案
}
cout << ans;
return 0;
}
使用动态规划解决砝码称重问题
这篇博客探讨了一种资源限制问题,即在给定的砝码重量集合下,如何通过动态规划算法确定能称量多少种不同的重量。程序以C++实现,主要逻辑在于考虑每个砝码的三种可能放置情况,并更新可行的重量组合计数。最后输出可行的重量方案数量。
869

被折叠的 条评论
为什么被折叠?



