有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 表示...