http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意:有一堆钱币, 已知它的总重量, 知道每种钱币的重量和价值, 求钱币堆的最小总价值
思路:
完全背包,每种物品可以取无限次
dp[i] i表示当前重量 dp[i]表示最小的价值
递推式:
初始化:
代码:
#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
typedef long long ll;
const int M=2e5+5;
const int inf=1e9+5;
int dp[10005];
int n,all1;
int w[505];
int p[505];
int m;
int main() {
int _;
scanf("%d",&_);
while(_--) {
fill(dp,dp+10005,inf);
scanf("%d",&all1);
scanf("%d",&n);
n-=all1;
scanf("%d",&m);
for(int i=1; i<=m; i++) {
scanf("%d",&p[i]);
scanf("%d",&w[i]);
dp[w[i]]=min(dp[w[i]],p[i]);
}
for(int i=0; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(i>=w[j])
dp[i]=min(dp[i],dp[i-w[j]]+p[j]);
}
}
if(dp[n]!=inf)
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[n]);
else
printf("This is impossible.\n");
}
return 0;
}