题目链接:
题目意思自己看吧。
算法分析:
对我来想是没有想到,最后看别人的博客才知道的。要把当中的一个条件当作体积。由于两个条件都存在负数,所以还要先保证最后不会再体积中出现负数的情况。这个easy想到就是给其加上一个题目负数的上限就好了。还有的就是当中的正负出现会影响计算时候的正逆顺序。细节自己看吧。我也不太懂得讲。
#include#include #include #include using namespace std;const int MAXN = 200005;const int INF = ~0U >> 2;int dp[MAXN],s[105],f[105];int main(){ int n; while(~scanf("%d",&n)) { int V = 100000; for(int i = 0;i < n;++i) scanf("%d%d",&s[i],&f[i]); for(int i = 0;i < MAXN;++i) dp[i] = -INF; dp[V] = 0; int maxv,minv; maxv = minv = V; for(int i = 0;i < n;++i){ if(s[i] > 0) for(int j = maxv;j >= minv;--j) dp[j+s[i]] = max(dp[j+s[i]],dp[j]+f[i]); else for(int j = minv;j <= maxv;++j) dp[j+s[i]] = max(dp[j+s[i]],dp[j]+f[i]); } int ans = 0; for(int i = V;i <= maxv;++i){ if(dp[i] >= 0) ans = max(ans,dp[i]+i-V); } printf("%d\n",ans); } return 0;}