01背包求具体方案

题目详情 - L3-001 凑零钱 (pintia.cn)

思路:

1.  01背包问题,价值即容量,因此只需要考虑价值。并且要找满足条件的最小序列,因为用dp后满足的答案会覆盖先满足的答案,所以将硬币从大到小排序,那么dp状态转移之后最后获得的答案就是最小序列。

2. 要输出最小序列,需要一个数组保存dp过程满足条件的选择。

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N = 1e4 + 10;
int n, m;
int a[N], dp[N];
bool choice[N][110]; //choice[i][j]表示选择第i个硬币并且已选择硬币总值为j

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	sort(a + 1, a + 1 + n, greater<int>());
	
	for(int i = 1; i <= n; i++) {
		for(int j = m; j >= a[i]; j--) {
			//dp[j] = max(dp[j], dp[j - a[i]]+a[i])
			if(dp[j] <= dp[j - a[i]] + a[i]) {  // 如果等于的话就是更小的序列
				dp[j] = dp[j - a[i]] + a[i];
				choice[i][j] = 1;
			}
		}
	}
	
	if(dp[m] == m) {
		bool flag = false;
		for(int i = n, j = m; i >= 1; i--) {
			if(choice[i][j]) {
			if(flag) cout << " ";
			cout << a[i];
			flag = true;
			j -= a[i];
			}
		}
		cout << endl;
	} else cout << "No Solution\n";


	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个小的8位灰色码头旋转位置传感器,提供128个独特的位置。它使用单个编码器轨道进行管理,其中8个触点间隔均匀。该“数字旋钮”编码器可用于控制您的arduino项目,它也可以用于寿命有限的运动控制系统。附件内容分享的代码是针对Arduino UNO R3开发的。它应该在任何Arduino上工作。该代码目前支持MCP23008,PCF8574和PCF8574A I2C扩展器。 128位高分辨率绝对编码器实物展示: 使用以下地址选择这些 0x00 - 0x07 MCP23008地址0x20-0x27。(这与较早的库修订版向后兼容) 0x20 - 0x27 PCF8574 0x38 - 0x3F PCF8574A 请注意,MCP23008和PCF8574芯片使用相同的i2c地址范围。许多LCD背包也使用这些芯片之一。在同一总线上混合所有这些时要小心,以避免重复地址。为了进一步混淆事物,原始I2C地址具有作为读/写信号的最低位,因此一些文档(如某些PCF8574数据表)将参考0x40和0x70,0x20和0x38向左移位一位。 安装 封闭的示例草图ACE128test通过任意一个和I2C背包驱动2x16显示,或直接从Arduino驱动,具体取决于您是否注释了LCD_I2C宏。 公共方法 用法 请参见ACE128测试示例。 包括您需要的所有编码器映射(见下文),以匹配ACE单元的引脚序列。 使用ACE128构造函数声明所有ACE128对象。它需要I2C地址和指向编码器映射的指针。可选的第三个整数可以取一个正整数来显示在eeprom中存储零信息的位置。允许三个字节。 从setup()调用每个ACE128对象的begin方法。这将使用eeprom设置或回退将当前位置设置为零。 pos()和upos()方法返回相对于逻辑零位置的位置,而不是由机械任意位置的编码器返回的零位置。当它滚动时,转动被存储以供mpos使用并保存在eeprom中 每循环一次(),调用pos(),upos()或mpos()并将值存储在一个变量中。访问i2c总线需要一些周期,所以每次要引用它时都不要调用pos()。 有三个设置功能 setZero() - 将当前位置设置为零(不更新多圈) setZero(int) - 将零点设置为给定的0-127数字 setMpos(int) - 将当前位置设置为此多圈值 编码器地图 该库带有各种编码器映射,可以在ACE和IO扩展器之间实现引脚的不同接线。这些由包含的make_encodermap示例草图生成。生成自定义编码器图: 编辑make_encodermap草图 更改pinOrder数组以匹配您的接线 更改pinString以匹配您的接线 将草图加载到Arduino 将串行监视器输出复制到ACE128文件夹中的新.h文件。 12345678用于“逆时针上升”接线,与数据表编号相匹配,建议进行面包板测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值