链接地址: 点此自动传送
题意: 很简单弄清楚 就是 n 个物品 每个物品有 p,a,c,m 属性 价值为g 在 p < P ,a < A , c < C,m < M 的条件下,获取最大的价值, 简单01背包还原路径问题
比赛时忘了咋还原了….写过的题目….记录一下方便以后查看
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rd(a) scanf("%d",&a)
#define rlld(a) scanf("%lld",&a)
#define me(a,b) memset(a,b,sizeof(a))
const int inf= 0x3f3f3f3f;
const int maxn= 38;
const ll mod =1e9+7;
int dp[maxn][maxn][maxn][maxn];
bool fa[maxn][maxn][maxn][maxn][maxn];
struct node{
int p,a,c,m,g;
}grp[maxn];
int main(){
int n,p,a,c,m;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>grp[i].p>>grp[i].a>>grp[i].c>>grp[i].m>>grp[i].g;
}
cin>>p>>a>>c>>m;
for(int i=0;i<n;i++){
for(int pi=p;pi>=grp[i].p;pi--){
for(int ai=a;ai>=grp[i].a;ai--){
for(int ci=c;ci>=grp[i].c;ci--){
for(int mi=m;mi>=grp[i].m;mi--){
if(dp[pi][ai][ci][mi]<dp[pi-grp[i].p][ai-grp[i].a][ci-grp[i].c][mi-grp[i].m]+grp[i].g){
dp[pi][ai][ci][mi]=dp[pi-grp[i].p][ai-grp[i].a][ci-grp[i].c][mi-grp[i].m]+grp[i].g;
fa[i][pi][ai][ci][mi]=1;
}
}
}
}
}
}
stack<int>qq;
for(int i=n-1;i>=0;i--){
if(p<0||a<0||c<0||m<0) break;
if(fa[i][p][a][c][m]){
p-=grp[i].p;
a-=grp[i].a;
c-=grp[i].c;
m-=grp[i].m;
qq.push(i);
}
}
cout<<qq.size()<<endl;
if(!qq.empty()) {
cout<<qq.top();
qq.pop();
}
while(!qq.empty()){
cout<<" "<<qq.top();
qq.pop();
}
return 0;
}