题海拾贝:P2347 [NOIP 1996 提高组] 砝码称重
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
我的博客:<但凡.
我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C++修炼之路》
欢迎点赞,关注!
1、题目
2、题解
#include<iostream>
using namespace std;
const int N = 1010;
int f[N];
int u[10] = { 0,1,2,3,5,10,20 };
int k[10];
int n, m;
int ret = 0;
int main()
{for (int i = 1;i <= 6;i++){cin >> k[i];ret += k[i] * u[i];}int sum = 0;f[0] = 1;//对0初始化for (int i = 1;i <= 6;i++){for (int j = ret;j >= 0;j--)//因为j是价值所以说j必须是从0开始{for (int p = 0;p <= k[i] && p * u[i] <= j;p++){f[j] = f[j]||f[j - p * u[i]];//哪个不为0就选哪个行了}}}//f表示的是从前i个挑选,能否凑成j。所以说最后得统计方案数//另外我们砝码必须都选,也就是必须选6个,所以这个题可以空间优化写for (int i = 1;i <= 1000;i++){if (f[i]) sum++;}cout <<"Total=" <<sum << endl;return 0;
}