题目链接

点我跳转

题目大意

给定 \(N\) 个物品和一个 \(X\) ,第 \(i\) 个物品的重量为 \(ai\),你可以从中选择任意个物品(不能不选)

假定选择了 \(S\) 个物品,物品的总重量为 \(V\)

那么再满足 \((X - V) \% S = 0\) 的前提下还需要支付 \((X - V) / S\) 的 \(money\)

问最少需要支付多少 \(money\)

解题思路

当 \(S\) 一定时

  • 为满足 \((X - V) \% S = 0\),则 \(V\) 需满足 \(V = X \% S\)

  • 为了使支付的 \(money\) 最少, 则 \(V\) 要尽可能大

于是可以枚举 \(S\)

并定义 \(dp[i][j][k]\) 表示从前 \(i\) 个物品中选择了 \(j\) 个物品使得总重量最大,且这 \(j\) 个物品的总重量 \(\% S = k\)

那么对于每个物品只有两种状态 : 选 \(or\) 不选

于是不难得到 :

\(dp[i][j][k] = dp[i - 1][j][k]\)

\(dp[i][j][k] = dp[i - 1][j - 1][(k - a[i] % S + S) % S] + a[i]\)

最后取最小的 \((X - dp[N][S][X \% S]) / S\) 即可

AC_Code

#include<bits/stdc++.h>

#define rep(i , a , b) for(int i = a ; i <= b ; i ++)

#define int long long

using namespace std;

const int N = 1e2 + 10;

int a[N] , dp[N][N][N];

signed main()
{
int n , x , mi = 1e18; cin >> n >> x; rep(i , 1 , n) cin >> a[i]; rep(S , 1 , n)
{
memset(dp , -1 , sizeof(dp)); dp[0][0][0] = 0; rep(i , 1 , n) rep(j , 0 , S) rep(k , 0 , S - 1)
{
dp[i][j][k] = dp[i - 1][j][k]; if(j > 0 && ~dp[i - 1][j - 1][(k - a[i] % S + S) % S]) dp[i][j][k] = max(dp[i][j][k] , dp[i - 1][j - 1][(k - a[i] % S + S) % S] + a[i]); } int res = dp[n][S][x % S]; if(~res) mi = min(mi , (x - dp[n][S][x % S]) / S);
} cout << mi << '\n'; return 0;
}

最新文章

  1. Git安装与配置
  2. 第三章SQL编程
  3. javascript 高级程序设计 十二
  4. boost编译批处理脚本
  5. Java基础 —— 面向对象
  6. nyoj-257 郁闷的C小加(一) 前缀表达式变后缀
  7. Android LogCat 日志记录
  8. 自定义滚轮效果选择器spinnerwheel的使用总结
  9. 解密HOMS
  10. 读书笔记:java并发
  11. 自定义ALV控件的工具条按钮
  12. 邮件报警shell脚本
  13. js字符串的操作
  14. Java中循环声明变量方法
  15. vscode指定扩展安装位置
  16. [LeetCode] 12,13 整数和罗马数互转
  17. h5页面在ios机上禁止长按复制
  18. Python类之类的成员
  19. Day8 linux软件包管理
  20. nginx相关命令

热门文章

  1. 排查 Linux 系统运行速度慢
  2. Spring boot AOP 记录请求日志
  3. Calendar 日期判断 等于 。小于。大于
  4. zabbix管理员设置
  5. Flink-v1.12官方网站翻译-P015-Glossary
  6. HDOJ 1028 母函数分析
  7. Codeforces Round #634 (Div. 3)
  8. .NetCore快速上手Consul,留给自己一点思考的空间
  9. Go语言中时间轮的实现
  10. woj1002-Genesis woj1003-birthofnoah woj1004-noah&#39;s ark