zoj 3164 各种背包

来源:互联网 发布:ios编程用什么语言 编辑:程序博客网 时间:2024/04/29 20:04

好久没有写博客了,因为最近刷的是水题,感觉没有什么写的必要,更重要的是都没有怎么好好a过一道题了,这道题也一点都不难,只是让我从tle到wa再到ac经历了漫长的时间啊。。。。就因为题意理解不好,最后结果如果不存在或者价值为负的时候都应该输入sorry的,而我没有好好理解题意啊!

下面是代码:

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>#include<map>using namespace std;#define rep(i,n) for(int i=0; i<n; i++)#define repf(i,n,m) for(int i=(n); i<=(m); ++i)#define repd(i,n,m) for(int i=(n); i>=(m); --i)#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b)#define fab(a) ((a)>0?(a):(0-(a)))#define ll long long#define arc(a) ((a)*(a))#define inf 10000000#define exp 0.000001#define N 1500int dp[N];int w[N],b[N];struct node{int k,v,p;}a[N];int n,d;char s[N];bool vis[N];void fun1(int p,int v){repf(i,p,d)if(dp[i-p]!=-inf)dp[i]=max(dp[i],dp[i-p]+v);}void fun2(int p,int v){repd(i,d,p)if(dp[i-p]!=-inf)dp[i]=max(dp[i],dp[i-p]+v);}void fun3(int p,int v){repf(i,p,d)if(b[i-p]!=-inf)b[i]=max(b[i],b[i-p]+v);}void fun4(int p,int v){repd(i,d,p)if(b[i-p]!=-inf)b[i]=max(b[i],b[i-p]+v);}int main(){ while(scanf("%d%d",&n,&d)!=EOF){int g;repf(i,1,n)scanf("%d%d%d",&a[i].k,&a[i].v,&a[i].p);        scanf("%d",&g);repf(i,1,d)  dp[i]=-inf;dp[0]=0;getchar();memset(vis,false,sizeof(vis));while(g--){            gets(s);            repf(i,0,d)w[i]=dp[i];int len=strlen(s);s[len]=' ';int t=0;rep(i,len+1)if(s[i]==' '){                    vis[t]=true;repf(i,0,d)b[i]=w[i];int l=1;int cont=a[t].k;if(cont==0 || cont*a[t].p>=d)fun3(a[t].p,a[t].v);else{                         while(l<cont) { fun4(l*a[t].p,l*a[t].v); cont-=l; l*=2; } fun4(cont*a[t].p,cont*a[t].v);}repf(i,0,d)dp[i]=max(dp[i],b[i]);t=0;}    elset=t*10+s[i]-'0';}repf(i,1,n)if(vis[i]==false){int l=1;    int cont=a[i].k;if(cont==0 || cont*a[i].p>=d)fun1(a[i].p,a[i].v);else{while(l<cont){fun2(l*a[i].p,l*a[i].v);cont-=l;l*=2;}fun2(cont*a[i].p,cont*a[i].v);}}if(dp[d]<0)printf("i'm sorry...\n");elseprintf("%d\n",dp[d]);}   return 0;}