這篇文章主要介紹“c++寶物篩選問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“c++寶物篩選問題怎么解決”文章能幫助大家解決問題。
小 FF 找到了王室的寶物室,里面堆滿了無數價值連城的寶物。
這下小 FF 可發財了,嘎嘎。但是這里的寶物實在是太多了,小 FF 的采集車似乎裝不下那么多寶物??磥硇?FF 只能含淚舍棄其中的一部分寶物了。
小 FF 對洞穴里的寶物進行了整理,他發現每樣寶物都有一件或者多件。他粗略估算了下每樣寶物的價值,之后開始了寶物篩選工作:小 FF 有一個最大載重為 W 的采集車,洞穴里總共有 n 種寶物,每種寶物的價值為 v_i ,重量為 w_i,每種寶物有 m_i件。小 FF 希望在采集車不超載的前提下,選擇一些寶物裝進采集車,使得它們的價值和最大。
輸入格式 第一行為一個整數 n 和 W,分別表示寶物種數和采集車的最大載重。
接下來 nn 行每行三個整數 v_i,w_i,m_i
輸出格式 輸出僅一個整數,表示在采集車不超載的情況下收集的寶物的最大價值。
輸入輸出樣例 輸入 #1復制 4 20 3 9 3 5 9 1 9 4 2 8 1 3 輸出 #1復制 47 說明/提示 對于 30\%30% 的數據,n≤∑m ≤10 ^4,0≤W≤10 ^3 對于 100\%100% 的數據,n≤∑m ≤10 ^5 ,0≤W≤4×10 ^4,1≤n≤100。
這道題的難點在于規定了每個寶物的數量,如果直接上三層循環又會tle所以做法稍微有些改變
#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int u[10006],v[11006],m[10006];
int n,t;
int f[100006];
int main(){
cin>>n>>t;
for(int i=1;i<=n;i++){
cin>>u[i]>>v[i]>>m[i];
}
for(int i=1;i<=n;i++){
for(int k=1;k<=m[i];k++){
for(int j=t;j>=1;j--){
if(j>=v[i]){
f[j]=max(f[j],f[j-v[i]]+u[i]);
}
}
}
}
cout<<f[t];
}#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a,b,c;
int u[10006],v[10006],m[10006];
int n,t;
int f[100006];
int main(){
cin>>n>>t;
int cnt;
cnt=0;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
for(int j=1;j<=c;j<<=1){
u[++cnt]=j*a,v[cnt]=j*b,c-=j;//可以將寶物按照2,4,8...的順序結合起來,如果最后有剩余再單獨判斷一下
//因為寶物按照順序組合起來,所以時間和價值也要處理,這樣做的好處是可以節省大量時間
}
if(c){//如果有剩余的情況特殊處理一下
u[++cnt]=c*a;
v[cnt]=c*b;
}
}
for(int i=1;i<=cnt;i++){
for(int j=t;j>=1;j--){
if(j>=v[i]){
f[j]=max(f[j],f[j-v[i]]+u[i]);
}
}
}
cout<<f[t];
}關于“c++寶物篩選問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。