标签:dp
刚开始想到的方法复杂度很大,抱着试一试的心态提交了,果然TLE了
然后搜了搜,是个完全背包,好多都不记得了,重新复习了一下。
第一个注释的解法是TLE的,第二个和第三个都是可行的,但思路不同。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int inf=0x7fffffff; #define N 10005 int dp[N],p[505],w[505]; void init(){ //memset(dp,-1,sizeof(dp)); for(int i=0;i<N;i++) dp[i]=inf; dp[0]=0; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int T,n,e,f; scanf("%d",&T); while(T--){ init(); scanf("%d%d%d",&e,&f,&n); for(int i=1;i<=n;i++) scanf("%d%d",&p[i],&w[i]); /*for(int i=1;i<=f-e;i++){//这个方法直接从n的规模开始考虑,明显没有用到dp的优点 for(int j=1;j<=n;j++){ for(int k=0;k*w[j]<=i;k++){ if(dp[i-k*w[j]]!=inf) dp[i]=min(dp[i],dp[i-k*w[j]]+p[j]*k); } } }*/ /*for(int i=1;i<=n;i++){//从前i-1种推至前i种 for(int j=w[i];j<=f-e;j++){ if(dp[j-w[i]]!=inf) dp[j]=min(dp[j],dp[j-w[i]]+p[i]); } }*/ for(int i=1;i<=f-e;i++) {//重量为i时,n种物品能到达的最小值,在这里不用考虑第j种物品的数量,因为i是从小到大的,那么我们每次计算的时候都自动沿用数量为k-1个的值 for(int j=1;j<=n;j++){ if(i-w[j]>=0&&dp[i-w[j]]!=inf) dp[i]=min(dp[i],dp[i-w[j]]+p[j]); } } if(dp[f-e]==inf) printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[f-e]); } return 0; }
标签:dp
原文地址:http://blog.csdn.net/lj94093/article/details/45287313