1 条题解
-
0
C++ :
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int v[70],p[70],q[70],f[33000]; int max(int a,int b){return a>b?a:b;} int main() { int n,m,i,j,k,t1,t2,k1,k2; int l=0; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&v[i],&p[i],&q[i]); } for(i=1;i<=m;i++) { k1=k2=t1=t2=0; if(q[i]==0)//要是主物件 { for(k=i+1;k<=m;k++) { if(q[k]==i)//找到附属物品1 { t1=k; k1=1; break; } } for(k=t1+1;k<=m;k++) { if(q[k]==i)//找到附属物品2 { t2=k; k2=1; break; } } for(j=n;j>=v[i];j--) { f[j]=max(f[j-v[i]]+v[i]*p[i],f[j]); f[j]=max(f[j-v[i]]+v[i]*p[i],f[j]);//只要主件或者都不要 if((j-v[i]-v[t1])>=0&&k1==1)//要附件1 f[j]=max(f[j-v[i]-v[t1]]+v[i]*p[i]+v[t1]*p[t1],f[j]); if((j-v[i]-v[t2])>=0&&k2==1)//要附件2 f[j]=max(f[j-v[i]-v[t2]]+v[i]*p[i]+v[t2]*p[t2],f[j]); if((j-v[i]-v[t1]-v[t2])>=0&&k1==1&&k2==1) f[j]=max(f[j-v[i]-v[t1]-v[t2]]+v[i]*p[i]+v[t1]*p[t1]+v[t2]*p[t2],f[j]); } } } printf("%d\n",f[n]); return 0; }
Pascal :
var n,m:longint; newv,newp:array[-1000..maxint] of longint; v,p,q:array[-1000..maxint] of longint; f:array[-1000..maxint] of longint; function calc(k:longint):longint; var i,j,x:longint; begin x:=1; newv[1]:=v[k]; newp[1]:=p[k]; for i:=1 to m do if q[i]=k then begin for j:=1 to x do begin newv[j+x]:=newv[j]+v[i]; newp[j+x]:=newp[j]+p[i]; end; x:=x*2; end; exit(x); end; procedure dp; var i,j,k,temp:longint; begin fillchar(f,sizeof(f),0); for i:=1 to m do begin if q[i]<>0 then continue; for j:=n downto 1 do for k:=1 to calc(i) do if j>=newv[k] then if (f[j]<f[j-newv[k]]+newp[k]) then f[j]:=f[j-newv[k]]+newp[k]; end; end; procedure init; var i:longint; begin read(n,m); for i:=1 to m do begin read(v[i],p[i],q[i]); p[i]:=p[i]*v[i]; end; end; begin //assign(input,'budget.in'); //reset(input); //assign(output,'budget.out'); //rewrite(output); init; dp; writeln(f[n]); //close(input); //close(output); end.
- 1
信息
- ID
- 3195
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者