首页 > 其他 > 详细

luogu【p1510】

时间:2019-08-04 23:08:57      阅读:98      评论:0      收藏:0      [点我收藏+]
普通的01背包问题

#include<bits/stdc++.h> using namespace std; const int MAXN = 10005; int dp[MAXN], v1[MAXN], weight[MAXN], v, n, c, sum, flag; int main() { cin >> v >> n >> c; for(int i = 1; i <= n; i++) { cin >> weight[i] >> v1[i]; sum += weight[i]; } if(sum < v) { cout << "Impossible"; return 0; } for(int i = 1; i <= n; i++) for(int j = c; j >= v1[i]; j--) { dp[j] = max(dp[j], dp[j-v1[i]]+weight[i]);//搜索体力最少为多少时可以填完海,并记录最少的体力 } for(int i = 1; i <= MAXN; i++) if(dp[i] >= v) flag = 1; if(flag) { for(int i = 1; i <= MAXN; i++) //从小到大枚举体力 { if(dp[i] >= v)//若此时用的体积已符合要求 { int a = c-i;//剩余体力 if(a < 0)//若此时剩余体力都小于零,说明后面要用更大的体力才能满足体积。所以直接就不用看后面的了,肯定不符合。 { cout << "Impossible"; return 0; } else { //若此时体力大于零,说明此时用的体积最小,剩余体积最大。直接输出。 cout << a; return 0; } } } } else { cout << "Impossible"; return 0; } }

  

luogu【p1510】

原文:https://www.cnblogs.com/lovezxy520/p/11300279.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!