【动态规划】Vijos P1313 金明的预算方案(NOIP提高组2006第二题)

来源:互联网 发布:上海市人口普查数据 编辑:程序博客网 时间:2024/04/30 12:58
题目链接:

  https://vijos.org/p/1313

题目大意:

  m(m<=32000)金钱,n(n<=60)个物品,花费vi,价值vi*ci,每个物品可能有不超过2个附件,附件没有附件。

题目思路:

  【动态规划】

  01背包。因为至多2个附件,且附件没有附件,所以可以直接枚举4种情况。

 

////by coolxxx////<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-8)#define J 10#define MAX 0x7f7f7f7f#define PI 3.14159265358979323#define N 64#define M 3204using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int v[N],c[N],q[N],l[N],r[N];int f[M];int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j;//for(scanf("%d",&cas);cas;cas--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))while(~scanf("%d",&m)){mem(f,0);mem(l,0);mem(r,0);m/=10;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d%d",&v[i],&c[i],&q[i]);v[i]/=10;if(q[i])if(l[q[i]])r[q[i]]=i;else l[q[i]]=i;}for(i=1;i<=n;i++){if(q[i])continue;for(j=m;j>=0;j--){if(j>=v[i])f[j]=max(f[j],f[j-v[i]]+c[i]*v[i]);if(l[i] && j>=v[i]+v[l[i]])f[j]=max(f[j],f[j-v[i]-v[l[i]]]+c[i]*v[i]+c[l[i]]*v[l[i]]);if(r[i] && j>=v[i]+v[r[i]])f[j]=max(f[j],f[j-v[i]-v[r[i]]]+c[i]*v[i]+c[r[i]]*v[r[i]]);if(l[i] && r[i] && j>=v[i]+v[l[i]]+v[r[i]])f[j]=max(f[j],f[j-v[i]-v[l[i]]-v[r[i]]]+c[i]*v[i]+c[l[i]]*v[l[i]]+c[r[i]]*v[r[i]]);}}printf("%d\n",f[m]*10);}return 0;}/*////*/


0 0
原创粉丝点击