rabbit的工作(2)
時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 32768k,其他語言65536k
64bit io format: %lld
rabbit通過了上次boss的考核,現在她又遇到了乙個問題。
rabbit接到了k個任務,每個任務她可以自由選擇用i天去完成(1≤ i≤ n)。刁鑽的boss想讓rabbit恰好用w天完成所有任務。
已知rabbit用i天完成乙個任務能讓boss獲得的滿意度為vi(因為完成任務的質量不同),她想知道在滿足boss要求的情況下能讓boss獲得的總滿意度最大是多少。
第一行三個整數n,k,w。
第二行n個整數vi,vi表示用i天完成乙個任務能讓boss獲得的滿意度。
輸出rabbit在滿足boss要求的情況下能讓boss獲得的總滿意度最大是多少。
示例1
3 3 5
6 2 4
16
rabbit可以選擇分別用1天,1天,3天完成這三個任務,最大滿意度為6+6+4=16
2≤ n,k≤ 2000,k≤ w≤ min(4000,2*k)
0注意恰好完成,-1標記不能完成的情況。
dp[i][j]:第i個任務在第j天完成的最大收益。
dp[i][j]=max(dp[i][j],dp[i-1][j-k]+v[k]) k:rand(1-n)。
#include using namespace std;
#define ll long long
#define mod 1000000007
#define maxn 401
int dp[2005][4005];
int main()
for(int i=0;i<=k;i++)
for(int j=0;j<=w;j++)
dp[i][j]=-1;
dp[0][0]=0;
for(int i=1;i<=k;i++)}}
cout《先都按一天完成,這樣就可以裝換為完全揹包。
dp[i][j]:對完成天數為i的任務進行pick時(選0個或多個),恰好多餘時間為j時能得到的最大收益。
dp[i][j]=max(dp[i][j-i+1]+v[i],dp[i-1][j]);
因為有負數所以初始化為int_min
#include using namespace std;
#define ll long long
#define mod 1000000007
#define maxn 401
int dp[2005][4005];
int main()
int re=v[1]*k;
w=w-k;
for(int i=0;i<=k;i++)
for(int j=0;j<=w;j++)
dp[i][j]=int_min;
for(int j=1;j<=n;j++)
dp[j][0]=0;
for(int i=2;i<=n;i++)
int re=v[1]*k;
w=w-k;
for(int i=0;i<=w;i++)
dp[i]=int_min;
dp[0]=0;
for(int i=2;i<=n;i++)
}printf("%d",re+dp[w]);
return 0;
}
01揹包:
完全揹包:
牛客練習賽36 BCDF題解
b.rabbit的工作 1 思路 設d i j p 為在 i 天時,一共工作了 j 天,且連續工作了 p 天直到第 i 天時花費的最小體力。那麼轉移方程很簡單 update 已經被hacked 如果第 i 天我不工作,那麼對於所有的合法的 p,d i j 0 max d i 1 j p 如果我第 i...
牛客練習賽36B題
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld rabbit大學畢業後找到了乙份實習工作,如果實習通過她就轉正了。實習期共有n天,其中有幾天公司集體放假,rabbit不用上班,剩下時間她可以選擇工作或者休息。rabb...
牛客練習賽9
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...