Codeforces 864E Fire(背包DP)

  背包DP,决策的时候记一下 jc[i][j]=1 表示第i个物品容量为j的时候要选,输出方案的时候倒推就好了

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2001;
struct poi{int t,ddl,p,id;}a[maxn];
int n,top,ansi,cnt;
int f[110][maxn],st[maxn],jc[110][maxn];
bool cmp(poi a,poi b){return a.ddl<b.ddl;}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d%d%d",&a[i].t,&a[i].ddl,&a[i].p);
        a[i].id=i;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<a[i].t;j++)f[i][j]=f[i-1][j];
        for(int j=a[i].t;j<=a[i].ddl-1;j++)
        {
            f[i][j]=f[i-1][j];
            if(f[i-1][j-a[i].t]+a[i].p>f[i][j])
            {
                f[i][j]=f[i-1][j-a[i].t]+a[i].p;
                jc[i][j]=1;
            }
        }
    }
    int ans=0;
    for(int i=0;i<a[n].ddl;i++)
    if(f[n][i]>ans)ans=f[n][i],ansi=i;
    for(int i=n;i&&ansi;i--)
    if(jc[i][ansi])cnt++,st[++top]=i,ansi-=a[i].t;
    printf("%d
%d
",ans,cnt);
    for(;top;top--)printf("%d ",a[st[top]].id);
}
View Code
原文地址:https://www.cnblogs.com/Sakits/p/7596229.html