利用完全背包找出最大的长度,然后贪心从最大的取。
class Solution { public: int dp[5005]={0}; string largestNumber(vector<int>& cost, int v) { for(int i=1;i<=v;i++)dp[i]=-500005; for(int i=1;i<=9;i++){ for(int j=cost[i-1];j<=v;j++){ dp[j]=max(dp[j],dp[j-cost[i-1]]+1); } } if(dp[v]<=0)return "0"; string ans=""; for(int i=9;i>=1;i--){ while(v>=cost[i-1]&&dp[v]==dp[v-cost[i-1]]+1){ v-=cost[i-1]; ans+='0'+i; } } return ans; } };