bzoj4247 挂饰 背包DP

来源:互联网 发布:vim设置python语法高亮 编辑:程序博客网 时间:2024/05/02 02:19

点击打开链接

思路:

背包问题,dp[i][j]表示在考虑第i个物品的时候,还剩下j个挂钩

注意,要按照挂钩多少排序,如果不排序的话,挂钩有可能会变成负数,然后又被加成正数

代码抄自:http://blog.csdn.net/creationaugust/article/details/48133509  

这个初始化 和 这个转换: 把一开始读入体积为0的物品的体积当成1,不为0的当成-v+1来做背包. 

想不到啊

dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i].x+1]+a[i].y);  // dp[i][n+1]=-INF 是 j-a[i].x+1 当j=n, a[i].x=0 时

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define mem(a) memset(a,0,sizeof(a))#define mp(x,y) make_pair(x,y)const int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 2e3+10;ll dp[maxn][maxn];struct node{int x,y;}a[maxn];bool cmp(node A,node B){return A.x > B.x;}int main(){int n = read();for(int i=1; i<=n; i++)a[i].x=read(),a[i].y=read();sort(a+1,a+1+n,cmp);for(int i=0; i<=n; i++)dp[0][i] = dp[i][n+1] = -INF;dp[0][1] = 0;for(int i=1; i<=n; i++)for(int j=0; j<=n; j++){dp[i][j] = max(dp[i-1][j],dp[i-1][max(j-a[i].x,0)+1]+a[i].y);// if(j<a[i].x)// dp[i][j] = max(dp[i-1][j],dp[i-1][1]+a[i].y);// else// dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i].x+1]+a[i].y);}ll ans = -INF;for(int i=0; i<=n; i++)ans = max(ans,dp[n][i]);cout << ans << endl;    return 0;}



0 0