设为首页 加入收藏

TOP

ZOJ 3812 We Need Medicine(牡丹江网络赛D题)
2015-07-20 17:43:03 来源: 作者: 【 】 浏览:1
Tags:ZOJ 3812 Need Medicine 牡丹江 网络

ZOJ 3812 We Need Medicine

题目链接

思路:dp[i][j][k]表示第i个物品,组成两个值为j和k的状态,这样会爆掉,所以状态需要转化一下

首先利用滚动数组,可以省去i这维,然后由于j最大记录到50,所以可以把状态表示成一个二进制数s,转化成dp[k] = s,表示组成k状态能组成s,这样空间复杂度就可以接受了,然后这题时限还可以,就这样去转移,然后记录下路径即可

代码:

#include 
  
   
#include 
   
     #include 
     using namespace std; const int N = 200005; typedef unsigned long long ull; typedef long long ll; int t, n, q, W[N], T[N], ans[55][N]; ull dp[N]; map
     
       LOG; int main() { scanf("%d", &t); for (int i = 0; i < 52; i++) LOG[(1ULL<
      
       = T[i]; j--) { ull tmp = dp[j]; if (dp[j - T[i]] == 0) continue; dp[j] |= ((dp[j - T[i]])<
       
         0; k &= (k - 1)) { ll x = k; ans[LOG[(x&(-x))]][j] = i; } } } int m, s; for (int i = 0; i < q; i++) { scanf("%d%d", &m, &s); if (!ans[m][s]) printf("No solution!\n"); else { int v = ans[m][s]; int bo = 0; while (v) { if (bo) printf(" "); else bo = 1; printf("%d", v); m -= W[v]; s -= T[v]; v = ans[m][s]; } printf("\n"); } } } return 0; }
       
      
     
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 3411 Paid Roads 下一篇Matlab基础学习------架构数组

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)