牛客网 【每日一题】6月10日 失衡天平
鏈接:
文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
終于Alice走出了大魔王的陷阱,可是現在傻傻的她忘了帶武器了,這可如何是好???這個時候,一個神秘老人走到她面前答應無償給她武器,但老人有個條件,需要將所選武器分別放在天平的兩端,若天平平衡則可以將天平上的所有武器拿走,還好這個天平銹跡斑斑,只要兩端重量相差小于等于m就會保持平衡,Alice傻傻的認為越重的武器越好,求Alice最多能拿走的武器總重量。(不限操作次數)
輸入描述:
第一行2個整數 n, m; 第二行n個整數x,分別表示n件武器的重量。 1 <= n <= 100; 0 <= m <= 100; 1 <=
x <= 100;
輸出描述:
一個整數,表示Alice最多能拿走的武器總重量。
示例1
輸入
輸出
132說明
可以稱兩次,第1次:(1 ; 5),第二次(61 ; 65)。
示例2
輸入
輸出
200說明
稱一次,(10,20,30,40 ; 100)。
題解:
第一感覺是dp
對于每個物品我們都要做出選擇:放在天平的左邊,放在天平的右邊,不選擇。
那么我們就可以去找遞推式:
dp[i][j]表示前i樣物品進行選擇后,此時天平兩端的重量差為j的時候,最大質量是多少,我們定義這個質量差為 左減右,那么左邊放物品質量差增大,右邊放質量差變小
我們想想dp[i][j]是怎么來的?
(a[i]表示第i件物品的質量)
如果我們選擇第i件物品,放在天平的左邊,那么dp[i][j]就是從dp[ i -1 ] [ j - a [ i ] ]來的(將第i件物品選擇前,質量差為j-a[i])轉移過來
同理:如果放在天平的右邊,那么dp[i][j]就是dp[i-1][j+a[i]]轉移而來的
如果不放,那就是dp[i-1][j]直接轉移過來
我們要找到最大的情況,就是上面三個取最大值
dp[i][j] = max(dp [ i -1 ] [ j ] , d p [ i - 1 ][ j - a [ i ] ] + a [ i ] ,d p [ i - 1 ] [j +a [ i] ] + a [ i ] )
因為題目有限定這個質量差的上限,所以最后我們求出這個范圍內的最大質量即可
max(sum,dp[n][i])
大致就是這樣
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+4; int dp[100][maxn]; int a[maxn]; int max(int a,int b,int c) {if(a>=b&&a>=c)return a;else if(b>=a&&b>=c)return b;else if(c>=b&&c>=a)return c; } int main() {memset(dp,-0x3f,sizeof(dp)); // cout<<dp[0][0]<<endl;int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];int sum=0;dp[0][0]=0;for(int i=1;i<=n;i++)for(int j=0;j<=maxn;j++){dp[i][j] = max(dp[i-1][j],dp[i-1][abs(j-a[i])]+a[i],dp[i-1][j+a[i]]+a[i]);} for(int i=0;i<=m;i++){sum=max(sum,dp[n][i]);}printf("%d",sum);return 0; }總結
以上是生活随笔為你收集整理的牛客网 【每日一题】6月10日 失衡天平的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么用ps画花(怎么用ps画花朵)
- 下一篇: 霸王的大陆安卓版(霸王的大陆安卓)