好几个代码应该是有问题的

都是直接单人dp一遍  双人dp一遍  

没有考虑到使用双生时 其中的英雄已经使用过的情况

下面的样例 输出应该为 30 

2 40 1
5 10
5 10
1 2 10

应当将双生的两个英雄作为一个整体考虑

直接四种情况一起转移

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define C getchar()-48
inline ll read(){
    ll s=0,r=1;
    char c=C;
    for(;c<0||c>9;c=C) if(c==-3) r=-1;
    for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    return s*r;
}
#define rep(i,sti,edi) for(int i=sti;i<=edi;i++)
const int N=1e3+10;
int n,cost,m;
ll dp[3][6][N];
struct xin{
    ll cost=0,v=0,tp=0,fnv=0;
}a[N];
int main(){
    n=read(),cost=read(),m=read();
    rep(i,1,n) a[i].cost=read(),a[i].v=read();
    rep(i,1,m){
        int x=read(),y=read();ll v=read();
        a[x].tp=y;a[y].tp=x;
        a[x].fnv=a[y].fnv=v;
    }
    rep(i,1,n){
        int dqkd=i&1;int qmkd=dqkd^1;
        int tpi=a[i].tp;
        rep(k,0,4) rep(j,0,cost) 
            dp[dqkd][k][j]=dp[qmkd][k][j];
        if(tpi&&tpi<i) continue;
        rep(k,1,4) rep(j,a[i].cost,cost) 
            dp[dqkd][k][j]=max(dp[dqkd][k][j],dp[qmkd][k-1][j-a[i].cost]+a[i].v);
        if(!tpi) continue;
        rep(k,1,4) rep(j,a[tpi].cost,cost) 
            dp[dqkd][k][j]=max(dp[dqkd][k][j],dp[qmkd][k-1][j-a[tpi].cost]+a[tpi].v);
        rep(k,2,4) rep(j,a[i].cost+a[tpi].cost,cost) 
            dp[dqkd][k][j]=max(dp[dqkd][k][j],dp[qmkd][k-2][j-a[i].cost-a[tpi].cost]+a[i].v+a[tpi].v+a[i].fnv);      
    }
    ll ans=0;
    rep(k,0,4) ans=max(ans,dp[n&1][k][cost]); 
    cout<<ans;
    return 0;
}