森炊的預算方案

来源:https://www.cnblogs.com/cylyz/archive/2017/12/25/8110817.html
-Advertisement-
Play Games

描述: 森炊今天沒吃藥很開森,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早,森炊就開始做預算了,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一 ...


描述

   森炊今天沒吃藥很開森,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早,森炊就開始做預算了,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子:
主件 附件
電腦 印表機,掃描儀
書櫃 圖書
書桌 臺燈,文具
工作椅 無
  如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有0個、1個或2個附件。附件不再有從屬於自己的附件。森炊想買的東西很多,肯定會超過媽媽限定的N元。於是,他把每件物品規定了一個重要度,分為5等:用整數1~5表示,第5等最重要。他還從網際網路上查到了每件物品的價格(都是10元的整數倍)。他希望在不超過N元(可以等於N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。

  設第j件物品的價格為v[j],重要度為w[j],共選中了k件物品,編號依次為j1,j2,……,jk,則所求的總和為:v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*為乘號)請你幫助森炊設計一個滿足要求的購物單。

輸入格式:

  輸入文件的第1行,為兩個正整數,用一個空格隔開:
N  m 
其中N(<32000)表示總錢數,m(<60)為希望購買物品的個數。
從第2行到第m+1行,第j行給出了編號為j-1的物品的基本數據,每行有3個非負整數
v  p  q
(其中v表示該物品的價格(v<10000),p表示該物品的重要度(1~5),q表示該物品是主件還是附件。如果q=0,表示該物品為主件,如果q>0,表示該物品為附件,q是所屬主件的編號)

輸出格式:

  輸出文件只有一個正整數,為不超過總錢數的物品的價格與重要度乘積的總和的最大值
(<200000)。

 

Sample Input

1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

Sample Output

2200

 

分析:

這道題有大坑;;

在這裡 我個大家提個醒(親身經歷 才知道 坑人)

看數據:
N M       附 
vi wi   0  1
      1  2
      0  3
      0  4
      3  5
最後一個物品,它是附件
那麼它的主件是哪個?  

是附3那一行的主件,還是附4那一行的主件??
  編號是在所有的 主件中編號   
     還是在所有的 物品中編號?? 

當然是所有物品中的編號!!

我第一眼就看錯了~~~~~~

每個主件可以有0個、1個或2個附件。

所以分類背包就OK了。

四種情況:

⒈只用主件;

⒉用主件和1號附件;

⒊用主件和2號附件;

⒋用主件和1,2號附件;

 

 

 源代碼:

#include<bits/stdc++.h>
//#include<iostream>
using namespace std;
int c,n;
int w[70][70],num,vv,v[70][70],p,sum[70];
bool bo[70]={};
int f[200000],wi;
int main()
{
cin>>c>>n;
for(int i=1;i<=n;i++)
{
cin>>w[0][i]>>vv>>p;
v[0][i]=vv*w[0][i];
if(p!=0)
{
bo[i]=1;
sum[p]++;
v[p][sum[p]]=v[0][i];//第p件物品的第sum件附件的"積";
w[p][sum[p]]=w[0][i];//第p件物品的第sum件附件的"錢".
num++;
}
}
for(int i=1;i<=n;i++)
{
if(bo[i]==0)
if(sum[i]==0)
for(int j=c;j>=w[0][i];j--)
f[j]=max(f[j],f[j-w[0][i]]+v[0][i]);
else if(sum[i]==1)
for(int j=c;j>=w[0][i];j--)
{
f[j]=max(f[j],f[j-w[0][i]]+v[0][i]);
if(j>=w[0][i]+w[i][1])
f[j]=max(f[j],f[j-w[0][i]-w[i][1]]+v[0][i]+v[i][1]);
}
else if(sum[i]==2)
for(int j=c;j>=w[0][i];j--)
{
f[j]=max(f[j],f[j-w[0][i]]+v[0][i]);
if(j>=w[0][i]+w[i][1])
f[j]=max(f[j],f[j-w[0][i]-w[i][1]]+v[0][i]+v[i][1]);
if(j>=w[0][i]+w[i][2])
f[j]=max(f[j],f[j-w[0][i]-w[i][2]]+v[0][i]+v[i][2]);
if(j>=w[0][i]+w[i][2]+w[i][1])
f[j]=max(f[j],f[j-w[0][i]-w[i][2]-w[i][1]]+v[0][i]+v[i][2]+v[i][1]);
}
}
sort(f+1,f+c+1);
cout<<f[c]<<endl;
return 0;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •   akka集群是高容錯、去中心化、不存在單點故障以及不存在單點瓶頸的集群。它使用gossip協議通信以及具備故障自動檢測功能。 Gossip收斂   集群中每一個節點被其他節點監督(預設的最大數量為5)。集群中的節點互相監督著,某節點所監督的狀態也正在被其他 ...
  • Akka本身使用了 來序列化內部消息(比如gossip message)。Akka系統還可以配置自定義序列化機制。 配置conf 預設的,在local actor之間(the same JVM)的消息是不會序列化的。可以通過 配置,來序列化所有消息(local和remote)。序列化所有的消息不回給 ...
  • 本文將從happens-before關係出發,結合ReentranLock源碼,如何用記憶體屏障、CAS操作、LOCK指令實現鎖的功能。 ...
  • 第一次在python中使用OpenCV(cv2),運行時報錯opencv-3.3.1\modules\highgui\src\window.cpp:339: error: (-215) size.width>0 && size.height>0 in function cv::imshow 源碼如下 ...
  • 單鏈表的12種基本操作 ...
  • 文件操作 1,文件路徑:d:\xxxx.txt 絕對路徑:從根目錄到最後 相對路徑:當前目錄下的文件 2,編碼方式:utf-8 3,操作方式:只讀,只寫,追加,讀寫,寫讀...... (1)只讀--r f =open('路徑',mode='r',encoding='編碼方式') content=f. ...
  • 一、OGNL表達式語言 Ognl Object Graphic Navigation Language(對象圖導航語言),它是一種功能強大的表達式語言(Expression Language,簡稱為EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現 ...
  • 一、開啟註冊表“win鍵+R鍵”並輸入regedit 二、在註冊表項 HKEY_CURRENT_USER\ Software\ Microsoft\ Command Processor 新建一個項,並修改數據為“cd /d C:\”,在/d空格後就是你要的路徑 修改成功是這樣的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...