DP 要求將承載量花光的01揹包問題

2022-03-11 14:53:34 字數 772 閱讀 7752

前言:很久沒有發部落格了,以後會撿起來,之後很長一段時間內我都會把精力放在攻克dp問題上,所以會經常上傳一些dp學習筆記,把一些比較好的,沒見過型別的dp問題都會傳上來,希望能夠變強吧。

因為今天很清醒的意識到世上有很多很優秀很驚豔的人,自己也要努力,努力成為那樣的人啊 。

例題 洛谷p1164 小a點菜

分析:乍看就是乙個普通的01揹包,仔細看下要求錢是要全花完的,而且dp陣列內儲存的不是最大價值,而應該是方法的數量,這樣處理起來是很不一樣了

這道題第三次做,之前兩次做都是最後無奈的屈從了題解,今天稍微看了看,就很輕鬆的做出來了,還是有進步的嘛。

在狀態轉移方程上,因為不再要求最大價值了,而且要把錢花光,所以01揹包的那些max都不虛要了,用dp[i][j]表示前i種物品花j元的話,狀態轉移方程就是

dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]] (a[i]是乙個菜花的錢數)

初始化一下:dp[0][0]=1 

然後加個滾動陣列就可以了。

上**:

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

const

double pi=acos(-1);5

int a[110];6

int dp[10010];7

intmain()

15 cout16return0;

17 }

01揹包變式 要求恰好裝滿的01揹包

ktv裡面有n首歌曲你可以選擇,每首歌曲的時長都給出了.對於每首歌曲,你最多只能唱1遍.現在給你乙個時間限制t t 10 9 問你在最多t 1秒的時間內可以唱多少首歌曲num 且最長唱歌時間是多少time time必須 t 1 最終輸出num 1 和 time 678 即可.注意 你需要優先讓歌曲數...

解決01揹包問題的DP方法

解題參考 題目描述 現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書 a類 文具 b類 差旅 c類 要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程式,在給出的一堆發票中找出可以報銷的 不超過給定額度的最大報銷額。輸入 測試輸入包含若干測...

01揹包一維dp陣列的實現

二維的01揹包模板 include include include using namespace std const int maxw 10000 const int maxn 100 int n,w int w maxw 2 v maxn 2 dp maxn 2 maxw 2 int main ...