#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
/*
* Welcome to vivo !
*/
int getCountOfApp(const char* input){
if(NULL == input){
return 0;
}
int cnt = 0;
for(int i=0;input[i]!=0;++i){
if(input[i] == ','){
++cnt;
}
}
return cnt/2;
}
//id start from 0
int getPositionOfApp(const char* input, const int id){
int cntOfComma = id*2 + 1;
int i=0;
for(;input[i]!=0&&cntOfComma!=0;++i){
if(input[i] == ','){
--cntOfComma;
}
}
while(input[--i]!=' '&&input[i]!='#');
return i+1;
}
#define APP_MAX 1000
#define DP_MAX 2048
int disks[APP_MAX];
int mems[APP_MAX];
int users[APP_MAX];
int dp[DP_MAX*DP_MAX];
int solution(const char* input){
const int countOfApp = getCountOfApp(input);//物品个数
if(0 == countOfApp){
return 0;
}
int res = 0;
int disk = 0;
int mem = 0;
sscanf(input, "%d %d", &disk, &mem);//容量限制
for(int i=0; i< countOfApp;++i){
const int pos = getPositionOfApp(input, i);
sscanf(input+pos, "%d,%d,%d", &disks[i], &mems[i], &users[i]);//物品消耗及价值
}
// TODO Write your code here!
vector<vector<vector<int>>> dp(countOfApp+1,vector<vector<int>>(disk+1,vector<int>(mem+1)));//大小切勿定义错误
for(int i=1;i<=countOfApp;i++)
{
for(int j=1;j<=disk;j++)//正序和倒叙皆可
//for(int j=disk;j>0;j--)
{
for(int k=1;k<=mem;k++)//正序和倒叙皆可
//for(int k=mem;k>0;k--)
{
if(j>=disks[i-1] && k>=mems[i-1])
{
dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-disks[i-1]][k-mems[i-1]]+users[i-1]);
}
else
{
dp[i][j][k]=dp[i-1][j][k];
}
}
}
}
return dp[countOfApp][disk][mem];
}
int main(int argc, char* args[])
{
char input[10000];
cin.getline(input,10000);
cout<<solution(input)<<endl;
}
输入:15 10 5,1,1000#2,3,3000#5,2,15000#10,4,16000
输出:31000