#include <bits/stdc++.h>
using namespace std;
#define int long long
#define min(a, b) (a<b?a:b)
#define rep(i, a, b) for(int i = a;i <= b;i++)
#define brep(i, a, b) for(int i = a;i >= b;i--)
const int Max = 5e3+5;
int n, x, dp[Max][Max][3];
struct node{
int vi, ai, ci;
}f[Max];
bool cmp(node l, node r)
{
if(l.vi == r.vi)
{
if(l.ai == r.ai)
return l.ci < r.ci;
return l.ai < r.ai;
}
return l.vi < r.vi;
}
int mmin(int a, int b, int c)
{
return min(min(a, b), c);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> x;
rep(i, 1, n)
cin >> f[i].vi >> f[i].ai >> f[i].ci;
sort(f+1, f+n+1, cmp);
rep(i, 1, n)
{
brep(j, x, f[i].ci)
{
//dp[i][j][f[i].vi]
int a, b, c, d, e, g;
a = dp[i-1][j][1];
b = dp[i-1][j][2];
c = dp[i-1][j][3];
d = dp[i-1][j-f[i].ci][1];
e = dp[i-1][j-f[i].ci][2];
g = dp[i-1][j-f[i].ci][3];
switch(f[i].vi)
{
case 1:d += f[i].ai;break;
case 2:e += f[i].ai;break;
default:g += f[i].ai;
}
if(mmin(a, b, c) == mmin(d, e, g))
{
if(a <= d&&b <= e&&c <= g)
{
dp[i][j][1] = d;
dp[i][j][2] = e;
dp[i][j][3] = g;
}
}
else if(mmin(a, b, c) < mmin(d, e, g))
{
dp[i][j][1] = d;
dp[i][j][2] = e;
dp[i][j][3] = g;
}
else
{
dp[i][j][1] = a;
dp[i][j][2] = b;
dp[i][j][3] = c;
}
}
rep(j, 0, f[i].ci-1)
{
dp[i][j][1] = dp[i-1][j][1];
dp[i][j][2] = dp[i-1][j][1];
dp[i][j][3] = dp[i-1][j][1];
}
}
//这里!!!!!!!!
//想顺延状态但dp值在调用i时总是显示为0
rep(i, 1, n)
{
rep(j, 0, x)
cout << dp[i][j][1] <<dp[i][j][2] << dp[i][j][3] << " ";
cout << endl;
}
return 0;
}
为什么把i换成数字就行了,改回来又不行了?百思不得其解 求助万能谷民