砝码称重(枚举and动态规划)
问题描述:
你有一架天平和N个砝码,N个砝码的重量分别是w1、w2、w3......wn。请你计算一共可以秤出多少种不同的重量?注意砝码可以放在天平的两边。
问题分析:首先砝码可以有三种状态,一个是放右边加重量,或者不放,再者就是放左边减重量,所以我们可以用枚举把每一个砝码的三种情况都枚举一遍,它的算法复杂度是3的N次方,当N越来越大时,3的N次方呈现指数爆炸式增长,极有可能会超时,但本题所给的样例不会超时,下面给出代码:
#include <iostream>
#include <iomanip>
typedef long long ll; /位数可能很长,所以用长整型
using namespace std;
const int maxn = 1e5 + 50;
int vis[maxn];
int a[maxn];
int N;
void dfs(int sum, int i) /三种状态函数
{
if (i == N)
{
if (sum >= 0)
vis[sum] = 1;
return;
}
dfs(sum + a[i], i + 1);
dfs(sum, i + 1);
dfs(sum - a[i], i + 1);
}
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
dfs(0, 0); /从开头开始递推
int ans = 0;
for (int i = 1; i < maxn; i++)
{
if (vis[i] )
{
ans++; /记录可以秤出重量的总数
}
}
cout << ans << endl;
return 0;
}
我们还有另外一种更巧妙更省时的方法,那就是用动态规划!我们可以用2次0-1背包问题来很好地解决这个问题,第一次0-1背包问题先把放右边的情况先弄清楚,接着第二次0-1背包就可以把放左边的情况弄清楚,整合后就是该问题的最终答案。
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
ll dp[1000005]; /本题的测试范围
ll w[105];
int main() {
ll N;
cin >> N;
for (int i = 1; i <=N; i++)
{
cin >> w[i];
}
memset(dp, 0, sizeof(dp)); /数据清空
dp[0] = 1;
for (ll i = 1; i <=N; i++)
{
for (ll j = 100000; j >= w[i]; j--)
{
dp[j] = max(dp[j], dp[j - w[i]]); /从大到小考虑每个称重,dp[j- w[i]]是没加之前的重量,如果可以加,就将d[i]赋值为1.
}
}
for (ll i = 1; i <= N; i++)
{
ll s = 100000 - w[i];
for (ll j = 1; j <= s; j++)
{
dp[j] = max(dp[j], dp[j +w[i]]); /从小到考虑每个称重,dp[j+ w[i]]是没减之前的重量,如果可以减,就将d[i]赋值为1.
}
}
ll ans=0;
for (int i = 1; i < 100000; i++)
{
ans = ans + dp[i]; /被赋值为1的即可以称出来的重量
}
cout << ans << endl;
return 0;
}
俞
砝码称重(枚举and动态规划)相关推荐
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-936 砝码称重
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 前言 关于数学的疑问 算法训练 砝码称重 ...
- 【蓝桥杯-砝码称重】
蓝桥杯-砝码称重 问题描述: 你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · WN 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边 输入的第一行包含 ...
- 51NOD 1449 砝码称重(贪心+进制思想)
题目连接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449 1449 砝码称重 题目来源: CodeForces 基 ...
- 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重
试题题目: 本题为编程题第二题 解题思路: 方法一:暴力求解 1.分析 首先利用数组W[N]W[N]W[N]记录NNN块砝码的质量. 模拟放取过程.先取第一块砝码放在天平上,再取第二块砝码 ...
- 洛谷 P2347 砝码称重
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- 【DP】砝码称重 (ssl 1072)
砝码称重 ssl 1072 题目大意: 有6种砝码,每种的个数分别为a1,a2,a3,a4,a5,a6,请问可以平出多少种重量(0除外) Description 设有1g.2g.3g.5g.10g.2 ...
- 【OJ8756】砝码称重V2,可达性多重背包
砝码称重V2 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计 ...
- 【codevs2144】砝码称重2,哈希什么的都去死吧
砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个 ...
- Bailian4141 砝码称重【DP】
4141:砝码称重 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),要求:计算用这些砝码能称出的不同 ...
- 【SSL】1072砝码称重
[SSL]1072砝码称重 Time Limit:1000MS Memory Limit:65536K Description 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重< ...
最新文章
- 无服务器计算将会取代容器?
- linux 设置系统时间
- C++ 关键字——friend
- codesmith学习总结
- 湖北经济学院的计算机怎么样,湖北经济学院怎么样名气高吗?真实排名及实力如何?是一本吗...
- Magento教程 16:Magento价格规则的优先度
- 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
- 微服务动态路由实现:OpenResty+K8s
- Spring Cloud Consul
- ALSA driver --PCM 实例创建过程
- 索引和数据完整性约束的总结
- numpy.ones用法
- 前端HTML中防止用户在短时间内频繁多次点击按钮
- python计算字节数_Python len()函数详解:获取字符串长度或字节数
- Machine Learning with Graphs:Part1
- 算法中的P问题、NP问题、NP难问题和NP完全问题
- 以ansi ,gbk,gb2312格式进行base64 加密和 base64解密(防止中文乱码)
- ISCC认证的申请条件是什么?
- eureka注册中心wro.css wro.js 404
- aiwi:如何称赞都不过分的革命性游戏