hdu3182 状态压缩dp
生活随笔
收集整理的這篇文章主要介紹了
hdu3182 状态压缩dp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 一個人做漢堡包,每個漢堡包有自己的花費和價值,某些漢堡包必須是在其他的某些漢堡包已經做好了的前提下才能制作,給你這個人的初始錢數,問最大的價值是多少。
思路:
? ? ? 一個人做漢堡包,每個漢堡包有自己的花費和價值,某些漢堡包必須是在其他的某些漢堡包已經做好了的前提下才能制作,給你這個人的初始錢數,問最大的價值是多少。
思路:
? ? ? 比較簡單的一個題目,首先我們開一個數組dp[i]表示i狀態(狀態壓縮)時的最大價值,把每一個狀態都用這n個漢堡包更新一下,還的開個數組money[i]表示的是i狀態是的剩余錢數,更新的時候記住一點就是每個點只能用一次,也就是當前狀態里如果有i這個點,那么i不能在來更新了。
#include<stdio.h> #include<string.h> int dp[1<<16]; int cost[20] ,vie[20]; int money[1<<16]; int limit[20][20];int maxx(int x ,int y) {return x > y ? x : y; }bool ok(int ii ,int now) {for(int i = 1 ;i <= limit[ii][0] ;i ++)if(!(now & (1 << (limit[ii][i] - 1)))) return 0;return 1; }int main () {int t ,n ,m ,i ,j;scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);for(i = 1 ;i <= n ; i++)scanf("%d" ,&vie[i]);for(i = 1 ;i <= n ;i ++)scanf("%d" ,&cost[i]);for(i = 1 ;i <= n ;i ++){scanf("%d" ,&limit[i][0]);for(j = 1 ;j <= limit[i][0] ;j ++)scanf("%d" ,&limit[i][j]);}for(i = 0 ;i <= (1 << n) - 1 ;i ++)dp[i] = -1000000000 ,money[i] = 0;dp[0] = 0 ,money[0] = m;int Ans = 0;for(i = 0 ;i <= (1<<n) - 1 ;i ++)for(j = 1 ;j <= n ;j ++){if(i & (1 << (j - 1))) continue;int now = i|(1<<(j-1));if(dp[now] < dp[i] + vie[j] && money[i] >= cost[j] && ok(j ,i)){dp[now] = dp[i] + vie[j];Ans = maxx(dp[now] ,Ans);money[now] = money[i] - cost[j];}}printf("%d\n" ,Ans);}return 0; }
總結
以上是生活随笔為你收集整理的hdu3182 状态压缩dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1074 状态压缩dp+记录方案
- 下一篇: hdu 5045 费用流