牛客 牛牛選物(01揹包)
阿新 • • 發佈:2020-12-12
技術標籤:LintCode及其他OJ揹包
文章目錄
1. 題目
連結:https://ac.nowcoder.com/acm/contest/9887/A
來源:牛客網
牛牛有現在有n個物品,每個物品有一個體積v[i]和重量g[i],他想選擇其中總體積恰好為V的若干個物品,想使這若干個物品的總重量最大,他想知道最大總重量為多少。(如果不存在合法方案,返回-1)
2. 解題
- 資料範圍 V 很大,開DP陣列要超時,採用雜湊表
class Solution {
public:
/**
* 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
* 返回總體積為V若干物品的最大總重量,如果g存在選擇若干物品總體積為V的情況,返回-1
* @param v int整型vector
* @param g int整型vector
* @param V int整型
* @return int整型
*/
int Maximumweight(vector<int>& v, vector<int>& g, int V) {
// write code here
int n = v.size();
unordered_map<int, int> dp;// V G
dp[0] = 0;
dp[v[0]] = g[0];
for(int i = 1; i < n; i++)
{
unordered_map<int , int> temp(dp.begin(), dp.end());
for(auto it = dp.begin(); it != dp.end(); ++it)
{
int vi = it->first;
int gi = it->second;
if(vi + v[i] <= V)
{
if(temp.find(vi+v[i]) == temp.end ())
temp[vi+v[i]] = gi + g[i];
else
temp[vi+v[i]] = max(temp[vi+v[i]], gi + g[i]);
}
}
dp.swap(temp);
}
if(dp.find(V) == dp.end()) return -1;
return dp[V];
}
};
585ms C++
我的CSDN部落格地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!