二話不說 先上**
#include #include #include #include #include #include #include #include #include #include #include #include #include #define pi acos(-1)
#define e exp(1)
#define inf 0x3f3f3f3f
using namespace std;
int dp[10005];
struct node;
node arr[505];
//選擇到最大的 就把所有的初始化為-inf 選擇最小的就初始化為inf 如果最後結果inf那麼肯定就是沒有狀態可以合理的轉移過去啦 只可以從0開始轉移
int main()
for(int i=1;i<=n;i++)
//for(int i=1;i<=weight;i++) cout
else cout<<"the minimum amount of money in the piggy-bank is "<}
return 0;
}
可以看出來 揹包問題有兩種 普通我們做的時候一般都是做的可以允許空間浪費的 而這種不允許空間浪費的還是很麻煩 以前我都是直接開乙個ok陣列來 可是在完全揹包o(vn)的做法下很不明智 導致我wa了好幾次 看了 kuangbin神的blog:
因為我們要求的是最小值 還要合法轉移 不妨把每乙個值都先預設成inf (最大值) 只有轉移的時候前乙個狀態不是inf(不可觸碰值) 才能進行轉移
我們的和離這inf有一段距離 所以說當dp[v-arr[i]]==inf的時候直接跳過不考慮轉移了 此時的dp[v] 仍然是前幾個完全揹包的和
轉移了之後狀態一定小於inf並且合法
所以可以繼續進行
當是求盡量大的時候也可以用個inf來轉移啊 只不過這個時候min變成了max inf就是個標記值
完全揹包 HDU 1114
今天看了看揹包九講的完全揹包。估計是因為只記住了方程,沒理解透的原因。照著寫,還是錯了 錯就錯在初始化的時候,我全部初始化為0了,然後用max 但是得不到答案。可是初始化出0位置以外,其他都為無窮大,取min,過了 額。去問問高手吧我。再研究了下,猛然回頭,發現,是求揹包裝滿的 最小價值 inclu...
HDU 1114 揹包問題
題意就是 給你一定的空間,一定種類的硬幣,每種硬幣可以重複使用多次,讓我們計算消耗這麼多的空間的最小質量 dp i 1 j 表示的就是從前i種硬幣中挑選質量小於j的最小價值 轉移方程 dp i 1 j min dp i j dp i 1 j w i v i 選取第i個 include include...
hdu 1114 完全揹包)
思路 在揹包九講中有提到,如果是要恰好裝滿,那麼這兒dp的初始化時應將dp 0 0,由於這兒是求最小值,故應將dp 1 dp n 置為正無窮 若是求最大值,則置為負無窮 1 include2 const int n 550 3 const int inf 1000000000 4 using nam...