http://codeforces.com/problemset/problem/19/B

对于每个物品,能偷多ti个,那么先让ti + 1, 表示选了这个东西后,其实就是选了ti + 1个了。那么只需要选出>=n个即可。

一开始的时候想不到ti + 1,一直不知道能多选ti个后,本来是选了多少个。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <assert.h>
  7. #define IOS ios::sync_with_stdio(false)
  8. using namespace std;
  9. #define inf (0x3f3f3f3f)
  10. typedef long long int LL;
  11.  
  12. #include <iostream>
  13. #include <sstream>
  14. #include <vector>
  15. #include <set>
  16. #include <map>
  17. #include <queue>
  18. #include <string>
  19. const int maxn = 2e3 + ;
  20. int w[maxn];
  21. int val[maxn];
  22. LL dp[ * + ];
  23. void work() {
  24. int n;
  25. cin >> n;
  26. int sum = ;
  27. for (int i = ; i <= n; ++i) {
  28. cin >> w[i] >> val[i];
  29. w[i]++;
  30. w[i] = min(w[i], );
  31. sum += w[i];
  32. }
  33. for (int i = ; i <= * - ; ++i) {
  34. dp[i] = 1e17L;
  35. }
  36. dp[] = ;
  37. sum = min(, sum);
  38. for (int i = ; i <= n; ++i) {
  39. for (int j = sum; j >= w[i]; --j) {
  40. dp[j] = min(dp[j], dp[j - w[i]] + val[i]);
  41. }
  42. }
  43. LL ans = 1e17L;
  44. for (int i = n; i <= sum; ++i) {
  45. ans = min(ans, dp[i]);
  46. }
  47. cout << ans << endl;
  48. }
  49.  
  50. int main() {
  51. #ifdef local
  52. freopen("data.txt", "r", stdin);
  53. // freopen("data.txt", "w", stdout);
  54. #endif
  55. work();
  56. return ;
  57. }

写了一个超时的二维费用背包

dp[i][j]表示前n个数选出i个,有j个可以免费拿的情况。

直接超时。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <assert.h>
  7. #define IOS ios::sync_with_stdio(false)
  8. using namespace std;
  9. #define inf (0x3f3f3f3f)
  10. typedef long long int LL;
  11.  
  12. #include <iostream>
  13. #include <sstream>
  14. #include <vector>
  15. #include <set>
  16. #include <map>
  17. #include <queue>
  18. #include <string>
  19. const int maxn = 2e3 + ;
  20. LL dp[maxn][maxn];
  21. int ti[maxn];
  22. int cost[maxn];
  23.  
  24. void work() {
  25. int n;
  26. cin >> n;
  27. int sum = ;
  28. for (int i = ; i <= n; ++i) {
  29. cin >> ti[i] >> cost[i];
  30. sum += ti[i];
  31. }
  32. for (int i = ; i <= + ; ++i) {
  33. for (int j = ; j <= + ; ++j) {
  34. dp[i][j] = 1e17L;
  35. }
  36. }
  37. dp[][] = ;
  38. sum = min(, sum);
  39. for (int i = ; i <= n; ++i) {
  40. for (int j = i; j >= ; --j) {
  41. for (int k = sum; k >= ti[i]; --k) {
  42. dp[j][k] = min(dp[j][k], dp[j - ][k - ti[i]] + cost[i]);
  43. }
  44. }
  45. }
  46. LL ans = 1e17L;
  47. for (int i = ; i <= n; ++i) {
  48. for (int j = sum; j >= ; --j) {
  49. dp[i][j] = min(dp[i][j], dp[i][j + ]);
  50. }
  51. }
  52. for (int i = ; i <= n; ++i) {
  53. ans = min(ans, dp[i][n - i]);
  54. }
  55. cout << ans << endl;
  56. // cout << dp[3][5] << endl;
  57. }
  58.  
  59. int main() {
  60. #ifdef local
  61. freopen("data.txt", "r", stdin);
  62. // freopen("data.txt", "w", stdout);
  63. #endif
  64. IOS;
  65. work();
  66. return ;
  67. }

B. Checkout Assistant 01背包变形的更多相关文章

  1. FZU 2214 Knapsack problem 01背包变形

    题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...

  2. codeforce Gym 101102A Coins (01背包变形)

    01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...

  3. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 【01背包变形】Robberies HDU 2955

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...

  5. CF#214 C. Dima and Salad 01背包变形

    C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...

  6. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  7. POJ 3211 Washing Cloths(01背包变形)

    Q: 01背包最后返回什么 dp[v], v 是多少? A: 普通01背包需要遍历, 从大到小. 但此题因为物品的总重量必定大于背包容量, 所以直接返回 dp[V] 即可 update 2014年3月 ...

  8. HDU 2955 Robberies(01背包变形)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)

    题意:给你若干个集合,每个集合内的物品要么选任意一个,要么所有都选,求最后在背包能容纳的范围下最大的价值. 分析:对于每个并查集,从上到下滚动维护即可,其实就是一个01背包= =. 代码如下: #in ...

随机推荐

  1. Django 后台管理设置(admin.py)

    上面是两种后台效果图,第一张是默认情况下Django的后台,第二张是稍作修改后的情况,下面记录下作了哪些修改: 代码: class ArticleAdmin(admin.ModelAdmin): li ...

  2. 搞定迅雷固件在TP-LINK WR720N,127.0.0.1 9000 获取不到激活码

    本帖最后由 exzzzipad 于 2014-7-2 22:33 编辑 基本情况:设备:TP-LINK WR720N目前固件:[antclan][20120825]720N-4M-NAS-withSA ...

  3. js屏蔽浏览器右键菜单,粘贴,复制,剪切,选中(转)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. WinForm DataGridView分页功能

    WinForm 里面的DataGridView不像WebForm里面的GridView那样有自带的分页功能,需要自己写代码来实现分页,效果如下图: 分页控件  .CS: 1 using System; ...

  5. Ajax跨域请求

    客户端前台: //浏览器支持跨域访问,置于Ajax方法前$.support.cors = true; 服务器后台: //设置服务器端对于CORS的跨域请求支持,置于后台方法第一行 Response.A ...

  6. 这些年正Android - 身在他乡

    “从不敢想到想去做到,做到我想的,事实证明我并不像他们想象的那样脆弱.我只是需要一盏灯,一架钢琴,一支麦克风.曾经想象过做一名医生救死扶伤,也曾想过做律师,做记者,做奥运冠军,但是都没有结果.因为我最 ...

  7. jQuery.fn.extend() 与 jQuery.extend()

    jQuery.fn如何扩展. jQuery插件 $.fn(object)与$.extend(object) jQuery提供了两个方法帮助开发插件 $.extend(object);扩展jQuery类 ...

  8. Orcle基本语句(五)

    --分页查询---begin --sqlserver top --mysql limit --oracle rownum(伪列),oracle中伪列(rownum,rowid) --查询工资为前五的信 ...

  9. ipython notebook设置工作路径和自动保存.py文件 ipython_notebook_config.py

    在安装完Anaconda,选择了配置环境变量后,打开cmd命令行 1. 打开命令行, 键入 ipython profile create 2. 键入 , 根据这个地址, 打开profile所在的文件夹 ...

  10. C语言运算符优先级和口诀(转)

    一共有十五个优先级: 1   ()  []  .  -> 2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof 3   ...