這道題目和搶銀行那個題目有點兒像,同樣涉及到包和物品的轉換。 我們將奶牛的兩種屬性中的一種當作價值,另一種當作花費。把總的價值當作包。然後對於每一頭奶牛進行一次01背包的篩選操作就行了。 需要特別注意的是,當x小於0的時候,循環應該是正向的,不明白的話,好好想想01背包的一維解法為什麼是逆向的。
#include<stdio.h> #include<string.h> #define MAX 99999999 #define N 201005 int dp[N]; int Max(int x,int y) { if(x>y) return x; else return y; } int main() { int n; while(scanf("%d",&n)!=EOF) { int i; for(i=0;i<N;i++) dp[i]=-MAX; dp[100000]=0; while(n--) { int x,y; scanf("%d%d",&x,&y); if(x<0&&y<0) continue; else if(x>0) { for(i=200000;i>=x;i--) dp[i]=Max(dp[i],dp[i-x]+y); } else { for(i=0;i<=200000+x;i++) dp[i]=Max(dp[i],dp[i-x]+y); } } int max=-MAX; for(i=200000;i>=100000;i--) { if(dp[i]>=0) max=Max(max,dp[i]+i-100000); } if(max>0) printf("%d\n",max); else printf("0\n"); } return 0; }