POJ 2184 Cow Exhibition (dp 轉換01背包)

來源:互聯網
上載者:User

題目:點擊開啟連結

題目大意:

有N個物品,每個物品有屬性Si和Fi,-1000 <= Si, Fi <= 1000, 每種物品最多隻能選一次,問怎樣選使得物品的所有Si和Fi屬性之和最大,並且要求Si之和與Fi之和都不能下於0.

思路:

這題想了很久都沒思路,於是跟前輩請教了下,恍然大悟。把屬性Si當做是物品的費用,Fi當做是價值,然後做01背包即可。


代碼:

#include<iostream>#include<queue>#include<stack>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<set>#include<string>#define MP make_pair#define SQ(x) ((x)*(x))typedef long long int64;const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;using namespace std;const int MOD = 1000000007;const int MAXN = 110;const int ADD = 1000*100;int n, m;int S[MAXN], F[MAXN];int f[1000000];int main(){scanf("%d", &n);int sum = 0;int idx = 0;for(int i=0; i<n; ++i){scanf("%d%d", &S[idx], &F[idx]);if(S[idx]<=0 && F[idx]<=0)continue;if(S[idx]>0)sum += S[idx];++idx;}memset(f, -INF, sizeof(f));f[ADD] = 0;for(int i=0; i<idx; ++i){if(S[i]>0){for(int v=sum+ADD; v>=S[i]; --v){f[v] = max(f[v], f[v-S[i]]+F[i]);}}else{for(int v=0; v-S[i]<=sum+ADD; ++v){f[v] = max(f[v], f[v-S[i]]+F[i]);}}}int ans = 0;for(int i=0; i<=sum; ++i)if(f[i+ADD]>=0)ans = max(i+f[i+ADD], ans);printf("%d\n", ans);return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.