硬幣拼湊(01揹包和完全揹包)

2022-09-08 08:18:11 字數 2405 閱讀 5769

有n1+n2種面值的硬幣,其中前n1種為普通幣,可以取任意枚,後n2種為紀念幣, 每種最多只能取一枚,每種硬幣有乙個面值,問能用多少種方法拼出m的面值?

輸入描述:

第一行輸入三個整數n1,n2,m        n1,n2<=1000 m<=100000

第二行輸入n1個整數表示普通幣的面值

第三行輸入n2個整數表示紀念幣的面值

不同的硬幣面值可能相同

輸出描述:

使用編號不同但面值相同的硬幣算不同的拼法

輸出用多少種方法拼出m的面值,由於答案過大,對1e9 + 7取模

第乙個問題:只考慮幣陣列,拼成指定錢數,有多少種方法

dp[i][j]:0...i 自由選,搞定j元有多少種方法

普遍位子如何填:

1:i號幣我不用,->dp[i-1][j]

2:i號幣我用,->dp[i-1][j-str[i]]

dp[i][j]任意使用0---i號幣,能組成j的錢來

【1,3,2,4】 8

dp[n-1][j]最事一行的意義是任意使用n個幣,能組成的j錢

*/public static long getdpone(int arr,int money)

long dp = new long[arr.length][money + 1];

for (int i = 0; i < arr.length; i++)

if (arr[0] <= money)

for (int i = 1; i < arr.length; i++)

}return dp;

}第二個問題:只考慮券陣列,拼成指定錢數,有多少種方法,每張券可以無限取

券在0....3上任意選,可以搞定100的方法數

dp[i][j]:券在0....i上任意選,可以搞定j的方法數

dp[i][j]任意使用0---i號幣(可以使用任意張),能組成j的錢來

【1,3,2,4】 8

dp[n-1][j]最事一行的意義是任意使用n個幣,能組成的j錢

*/public static long getdparb(int arr,int money)

long dp=new long[arr.length][money+1];

for(int i=0;i=0?dp[i][j-arr[i]]:0;

dp[i][j]=dp[i][j]%100000007;}}

return dp;

}原問題:

有n1+n2種面值的硬幣,其中前n1種為普通幣,可以取任意枚,後n2種為紀念幣, 每種最多只能取一枚,每種硬幣有乙個面值,問能用多少種方法拼出m的面值?

//任意張的陣列,一張的陣列,不可能都沒有

long dparb=getdparb(arbitrary,money);

long dpone=getdpone(onlyone,money);

if(dparb==null)

if(dpone==null)

long res=0;

for(int i=0;i<=money;i++)

return res;

}

01揹包和完全揹包

在hihocoder上面的題目中看到的這個問題,總結一下。先看01揹包問題。01揹包問題 乙個揹包總容量為v,現在有n個物品,第i個 物品體積為weight i 價值為value i 現在往揹包裡面裝東西,怎麼裝能使揹包的內物品價值最大?看到這個問題,可能會想到貪心演算法,但是貪心其實是不對的。例如...

0 1揹包和完全揹包

一.0 1揹包 1.0 1揹包指的是每件物品要麼取一次,要麼不取,目的是找到裝到揹包裡最大價值。c n 代表物體重量,w n 代表物體價值,v代表揹包容量。2.時間複雜度 o n v n指的是物品個數,v指的是揹包的容量,這是最優情況,無法再優。3.空間複雜度 原始 f n 1 v 1 改進 f v...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...