背包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\n%d\n",ans,cnt);
    for(;top;top--)printf("%d ",a[st[top]].id);
}
View Code

相关文章:

  • 2022-01-07
  • 2021-12-27
  • 2022-12-23
  • 2021-08-09
  • 2021-12-29
  • 2022-12-23
  • 2022-01-27
  • 2021-08-07
猜你喜欢
  • 2022-12-23
  • 2022-01-30
  • 2022-12-23
  • 2021-11-17
  • 2022-12-23
  • 2021-06-21
  • 2022-12-23
相关资源
相似解决方案