点击打开链接 #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int M=40100; const int inf=1<<30; struct Node{ int h; int a; bool operator<(const Node& t)const { return a<t.a; } }node[M]; // 高度->体积 int dp[M]; // dp[j] 前i种物品能否填满体积为J的背包 int main() { int n,num=1; cin>>n; for(int i=1;i<=n;i++) { int h,a,c; cin>>h>>a>>c; int k=1; while(k<=c) //拆分 { node[num].h=h; node[num++].a=a; k++; } } sort(node+1,node+num); // 有限制的先进行决策 dp[0]=1; // 能填满标记为1 int ans; for(int i=1;i<num;i++) { for(int j=node[i].a;j>=node[i].h;j--)//01 逆推 { dp[j]=dp[j]||dp[j-node[i].h]; //用or不用第i件物品 } } for(int j=node[num-1].a;j>=0;j--) { if(dp[j]) { ans=j; break; } } cout<<ans<<endl; return 0; }