//給出Xiaoqian的錢幣的價值和其身上有的每種錢的個數
//商家的每種錢的個數是無窮,xiaoqian一次最多付20000
//問如何付錢交易中錢幣的個數最少
//Xiaoqian是多重揹包
//商家是全然揹包
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 20010 ;
const int inf = 0x3f3f3f3f ;
int dp[maxn] ;
int dp_1[maxn] ;
int c[maxn],v[maxn] ;
int n , t ;int cas = 0 ;
int main()
{
//freopen("in.txt" ,"r" , stdin) ;
while(scanf("%d%d",&n , &t) &&(n+t))
{
for(int i = 1;i <= n;i++)
scanf("%d" , &v[i]) ;
for(int i = 1;i <= n;i++)
scanf("%d" , &c[i]) ;
for(int i = 1;i < maxn;i++)
dp[i] = dp_1[i] = inf ;
dp_1[0] = 0 ; dp[0] = 0 ;
for(int i = 1;i <= n;i++)
for(int j = v[i] ; j < maxn ;j++)
dp_1[j] = min(dp_1[j], dp_1[j-v[i]] + 1) ;
for(int i = 1;i <= n;i++)
{
for(int k = 1;k <= c[i];k*=2)
{
for(int j = maxn - 1;j >= k*v[i];j--)
dp[j] = min(dp[j] , dp[j-k*v[i]] + k) ;
c[i]-=k;
}
for(int j = maxn-1;j >= c[i]*v[i];j--)
dp[j] = min(dp[j] , dp[j - c[i]*v[i]] + c[i]) ;
}
int ans = inf;
for(int i = t; i <= maxn -10;i++)
if(dp[i] != inf && dp_1[i - t] != inf)
ans = min(dp[i] + dp[i-t] , ans) ;
printf("Case %d: " ,++cas) ;
if(ans == inf)puts("-1") ;
else cout<<ans<<endl;
}
}
hdu3591The trouble of Xiaoqian 多重揹包+全然揹包
相關文章
- 01揹包、完全揹包、多重揹包詳解
- javascript演算法基礎之01揹包,完全揹包,多重揹包實現JavaScript演算法
- 005多重揹包問題||
- 揹包問題(01揹包與完全揹包)
- 揹包DP——完全揹包
- 揹包DP——混合揹包
- 分組揹包、完全揹包
- 【模板】01揹包、完全揹包
- 【BZOJ 5003】與鏈 (多重揹包 dp)
- 深入剖析多重揹包問題(上篇)
- 深入剖析多重揹包問題(下篇)
- 揹包
- 01揹包、有依賴的揹包
- 01 揹包
- 揹包DP
- 01揹包和完全揹包問題解法模板
- 揹包問題
- 多重揹包問題的單調佇列優化佇列優化
- 多重揹包動態規劃及空間優化動態規劃優化
- HDU - 2191 珍惜現在,感恩生活(多重揹包板題)
- Hdu2191珍惜現在,感恩生活(多重揹包,模板)
- 01揹包問題
- dp-完全揹包
- 通天之分組揹包
- 01 揹包問題
- 揹包九講(部分)
- 【例9.14】混合揹包
- POJ 2184 (01揹包)
- 51nod 1597 有限揹包計數問題 (揹包 分塊)
- 揹包 學習筆記筆記
- 揹包題型總結
- 揹包問題大合集
- 01 揹包的變形
- 經典揹包問題
- [unknown OJ] ZZH與揹包
- 部分揹包問題(挖
- 揹包九講問題
- 從【零錢兌換】問題看01揹包和完全揹包問題