小a最近迷上了在上課時玩《**礦工》這款遊戲。為了避免被老師發現,他必須小心翼翼,因此他總是輸。在輸掉自己所有的金幣後,他向你求助。每個**可以看做乙個點(沒有體積)。現在給出你n個**的座標,挖到它們所需要的時間以及它們的價值。有些**在同一條直線上,這時候你必須按順序挖。你可以瞬間把鉤子轉到任意角度。請你幫助小a算出在時間t內他最多可以得到多少價值的金子。
輸入格式:
第一行,兩個整數n和t,表示**的個數和總時間。接下來n行,每行四個整數x,y,t,v分別表示**的座標,挖到這個**的時間,以及這個**的價值。(0≤|x|≤200,0輸出格式:
乙個整數,表示你可以在t時間內得到的最大價值。
樣例:in out
3 10
1 1 1 1
2 2 2 2
1 3 15 9
33 10
1 1 13 1
2 2 2 2
1 3 4 7
7大體思路:特殊的有依賴的揹包通過一些奇技淫巧轉化為分組揹包
具體實現:
先排序,把在一條線上的的**組成乙個組,然後因為必須選了前面的的才可以選後面的,所以可以將它們轉化字首和的形式,每乙個字首和就是乙個新的物品,然後分組揹包處理即可。
醜陋的 ac**:
#includeusing namespace std;
#define maxn 205
#define maxm 40005
#define eps 1e-6
int n,m;
struct node
con[maxn];
bool cmp(node a,node b)
//先按照斜率排,再按座標,可以在初始化的時候節約一些時間
int v[maxn][maxn],t[maxn][maxn],f[maxm];//v,t分別為新的物品的價值和消耗
int pack[maxn],cnt;
inline void start()//初始化
else
}}inline void dp()//分組揹包dp
}int main()
start();
dp();
printf("%d\n",f[m]);
return 0;
}//有依賴的揹包可以將價值,重量等寫成字首和的形式,然後當作分組揹包除理
希望蒟蒻的思路可以幫到各位dalao
~~第乙個解題報告不要介意~~
leetcode 黃金礦工
你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 每當礦工進入乙個單元,就會收集該單元格中的所有 礦工每次可以從當...
黃金礦工 回溯演算法
你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 示例 2 輸入 grid 1,0,7 2,0,6 3,4,5 0...
力扣 黃金礦工
你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 每當礦工進入乙個單元,就會收集該單元格中的所有 礦工每次可以從當...