我们将奶牛的两种属性中的一种当作价值,另一种当作花费。把总的价值当作包。然后对于每一头奶牛进行一次01背包的筛选操作就行了。
需要特别注意的是,当x小于0的时候,循环应该是正向的,不明白的话,好好想想01背包的一维解法为什么是逆向的。
#include#include #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 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; }