洛谷 p1064 预算
思想完全是一样的啊。。。。为毛我的炸掉
#include<iostream> #include<string.h> #include<math.h> #include<stdio.h> #include<map> #include<algorithm> using namespace std; /* µÚÒ»´Îʧ°ÜÔÒò£» Ö»µ¥´¿±È½Ï¸÷¸ö¼þÍüÁËÖ÷¼þÖ»ÄÜ·ÅÒ»´Î *****Êý¾Ý¿Ó****** */ int n,m,maxn; int f[32005]; int flag[66]; struct infor{ int v; int p; int q; int num[3]; }a[66]; int main() { int i,j; cin>>n>>m; for(i=1;i<=m;i++) { scanf("%d",&a[i].v); scanf("%d",&a[i].p); scanf("%d",&a[i].q); if(a[i].q!=0) { int t=a[i].q; a[t].num[++a[t].num[0]]=i; } } /*for(i=1;i<=m;i++) { printf("a[%d].q=%d,a[%d].num[0]=%d,a[%d].num[1]=%d,a[%d].num[2]=%d\n",i,a[i].q,i,a[i].num[0],i,a[i].num[1],i,a[i].num[2]); }*/ for(i=1;i<=m;i++) { for(j=n;j>=a[i].v;j--) { if(a[i].q==0) f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p); } }//ֻѡÖ÷¼þ for(i=1;i<=m;i++) { infor w=a[a[i].q]; infor k=a[w.num[1]]; infor e=a[w.num[2]]; for(j=n;j>=a[i].v;j--) { if (a[i].q!=0) { int x=0,y=0; if(j-a[i].v-k.v>=0) { x=max(f[j],f[j-a[i].v-k.v]+a[i].v*a[i].p+k.v*k.p); } if(j-a[i].v-e.v>=0) { y=max(f[j],f[j-a[i].v-e.v]+a[i].v*a[i].p+e.v*e.p); } f[j]=max(x,y); } else { f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p); } } }//Ñ¡Ö÷¼þ +Ò»¸± for(i=1;i<=m;i++) { infor w=a[a[i].q]; infor k=a[w.num[1]]; infor e=a[w.num[2]]; for(j=n;j>=a[i].v-k.v-e.v;j--) { if(a[i].q!=0) { f[j]=max(f[j],f[j-a[i].v-k.v-e.v]+a[i].v*a[i].p+k.v*k.p+e.v*e.p); } else { f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p); } } }//Ñ¡Ö÷¼þ +2¸± for(i=0;i<=n;i++) { maxn=max(maxn,f[i]); } printf("%d\n",maxn); return 0; }
#include <iostream> #define maxn 32005 using namespace std; int n,m; int v,p,q; int main_item_w[maxn]; int main_item_c[maxn]; int annex_item_w[maxn][3]; int annex_item_c[maxn][3]; int f[maxn]; int main(){ cin >> n >> m; for (int i=1;i<=m;i++){ cin >> v >> p >> q; if (!q){ main_item_w[i] = v; main_item_c[i] = v * p; } else{ annex_item_w[q][0]++; annex_item_w[q][annex_item_w[q][0]] = v; annex_item_c[q][annex_item_w[q][0]] = v * p; } } for (int i=1;i<=m;i++) for (int j=n;main_item_w[i]!=0 && j>=main_item_w[i];j--){ f[j] = max(f[j],f[j-main_item_w[i]]+main_item_c[i]); if (j >= main_item_w[i] + annex_item_w[i][1]) f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][1] ] + main_item_c[i] + annex_item_c[i][1]); if (j >= main_item_w[i] + annex_item_w[i][2]) f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][2] ] + main_item_c[i] + annex_item_c[i][2]); if (j >= main_item_w[i] + annex_item_w[i][1] + annex_item_w[i][2]) f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][1] - annex_item_w[i][2] ] + main_item_c[i] + annex_item_c[i][1] + annex_item_c[i][2]); } cout << f[n] << endl; return 0; }