1. 程式人生 > >Piggy-Bank HDU - 1114

Piggy-Bank HDU - 1114

解法

完全裝滿揹包

求最小值那麼把所有的dp設定成inf(要完全裝滿),且轉移方程寫min,原點設定為0,然後套完全揹包就可以了

能不能完全裝滿的檢測就是看dp[m]有沒有更新,更新了那麼就是能完全裝滿否則完全裝不滿

程式碼

#include <bits/stdc++.h>
using namespace std;
int dp[1000005],v[1000],w[1000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t;
  cin>>t;
  while(t--)
  {
    int m1,m2;
    cin>>m1>>m2;
    int m=m2-m1;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>w[i]>>v[i];
    fill(dp,dp+1000005,999999999);
    dp[0]=0;
    for(int i=0;i<n;i++)
    for(int j=v[i];j<=m;j++)
    dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
    if(dp[m]==999999999)
    cout<<"This is impossible.\n";
    else
    cout<<"The minimum amount of money in the piggy-bank is "<<dp[m]<<".\n";
  }
}