非常经典的dp题,因为1至8的最大公约数是840,任何一个数的和中840的倍数都是可以放在一起算的,

所以我只需要统计840*8的值(每个数字(1-8)的sum%840的总和),剩下都是840的倍数

dp[i][j] 代表讨论了第i位并且每个数字取余为j的情况

#include <assert.h>
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <ctime>
#include <time.h>
using namespace std;
const int N = 2e5 + 5;
const int INF = 0x3f3f3f3f;
typedef long long ll; ll a[10];
ll dp[10][8400]; int main() {
ll w;
while(~scanf("%lld", &w)) {
for(int i = 0; i < 8; ++i) {
scanf("%lld", &a[i]);
}
memset(dp, -1, sizeof(dp));
dp[0][0] = 0;
for(int i = 0; i < 8; ++i) {
for(int j = 0; j < 8400; ++j) {
if(dp[i][j] == -1) continue;
int edge = min(1ll * 840 / (i + 1), a[i]);
for(int k = 0; k <= edge; ++k) {
dp[i + 1][j + k * (i + 1)] = max( dp[i + 1][j + k * (i + 1)], dp[i][j] + (a[i] - k) / (840 / (i + 1)));
}
}
} ll ans = -1;
for(int i = 0; i < 8400; ++i) {
if(dp[8][i] == -1 || i > w) continue;
ans = max(ans, i + min( (w - i) / 840, dp[8][i]) * 840);
}
printf("%lld\n", ans);
}
return 0;
}

最新文章

  1. JavaScript动画知多少?
  2. Java你可能不知道的事(3)HashMap
  3. hdu5033 Building (单调栈+)
  4. 安装、部署... Windows服务 .net程序 安装 命令
  5. NODE学习:利用nodeJS去抓网页的信息
  6. Oracle自定义数据类型 2 (调用对象方法)
  7. Windows 7 Shortcuts (完整兼具分类有序,想我所想,赞!)
  8. ecshop 商店设置,新增或者修改字段
  9. delphi 写系统日志监控 转
  10. Typecho 代码阅读笔记(二) - 数据库访问
  11. fast-json.jar的用法
  12. Linux_Ununtu 16.04 的下载安装并部署.Net Core 网站
  13. BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs
  14. git命令行在windows中报错WARNING: terminal is not fully functional
  15. oracle异机恢复参考官方文档
  16. LeetCode算法题-Intersection of Two Linked Lists(Java实现)
  17. python字符串与列表的相互转换
  18. Android Selector 与 Shape 基本用法
  19. 如何获取控件id,包名,类名
  20. linux文件查看

热门文章

  1. SPH算法(求最小代价树)
  2. Css中路径data用法
  3. Cloudera Manager 4.6 安装部署hadoop CDH集群
  4. bootstrap datetimepicker 在 angular 项目中的运用
  5. 洛谷 P1073 最优贸易
  6. Redis的Pub/Sub客户端实现
  7. 理解JavaScript继承(二)
  8. 【转】np.linspace()、np.logspace()、np.arange()
  9. 1548: Design road (思维题 做法:三分找极值)
  10. start_kernel之前的汇编代码分析