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";
  }
}
posted @ 2019-01-08 21:56  baccano!  阅读(142)  评论(0编辑  收藏  举报