洛谷P1510-精卫填海(01背包)
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1510-精卫填海(01背包)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
【問題描述】
發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首,白喙,赤足,名曰精衛,其名自詨。是炎帝之少女,名曰女娃。女娃游于東海,溺而不返,故為精衛。常銜西山之木石,以堙于東海。——《山海經》
精衛終于快把東海填平了!只剩下了最后的一小片區域了。同時,西山上的木石也已經不多了。精衛能把東海填平嗎?
事實上,東海未填平的區域還需要至少體積為v的木石才可以填平,而西山上的木石還剩下n塊,每塊的體積和把它銜到東海需要的體力分別為k和m。精衛已經填海填了這么長時間了,她也很累了,她還剩下的體力為c。
輸入格式:
輸入文件的第一行是三個整數:v、n、c。
從第二行到第n+1行分別為每塊木石的體積和把它銜到東海需要的體力。
輸出格式:
輸出文件只有一行,如果精衛能把東海填平,則輸出她把東海填平后剩下的最大的體力,否則輸出’Impossible’(不帶引號)。
輸入輸出樣例:
輸入 #1復制
100 2 10 50 5 50 5輸出 #1復制
0輸入 #2復制
10 2 1 50 5 10 2輸出 #2復制
Impossible說明/提示:
【數據范圍】
對于20%的數據,0<n<=50。
對于50%的數據,0<n<=1000。
對于100%的數據,0<n<=10000,所有讀入的數均屬于[0,10000],最后結果<=c。
AC Code:?
#include<bits/stdc++.h> using namespace std; #define N 10010 int v,n,c,dp[N],tl[N],tj[N]; int main() {scanf("%d %d %d",&v,&n,&c);for(int i=1;i<=n;i++) {scanf("%d %d",&tj[i],&tl[i]);//分別為相應的體積和耗費的體力 }for(int i=1;i<=n;i++) {for(int j=c;j>=tl[i];j--) {dp[j]=max(dp[j],dp[j-tl[i]]+tj[i]);}}if(dp[c]<v) {//無法填平東海 printf("Impossible\n");}else {for(int i=1;i<=c;i++) {//循環查找精衛在多少體力時就已經將東海填平 if(dp[i]>=v) {//大于需要的體積表示此時已經填平 printf("%d\n",c-i);//c為精衛的總體力,i為填平東海耗費的體力,相減即為剩余的體力 break;}}}return 0; }總結
以上是生活随笔為你收集整理的洛谷P1510-精卫填海(01背包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据挖掘之监督学习篇
- 下一篇: google s2 java开发文档