luogu【p1510】 精卫填海

普通的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; } }

  

猜你喜欢

转载自www.cnblogs.com/lovezxy520/p/11300279.html