标签:
题意:xhd玩游戏,还需要n个经验值升级,还留有m的忍耐度,但是他最多打s只怪,给出k个怪的经验值a[i],以及消耗的忍耐度b[i],问xhd能不能升级--
因为有两个限定,忍耐度,和最多打s只怪(即没打一只怪,要消耗1),又因为每只怪有无数只,所以是二维的完全背包--
后来写了发现不对(过了样例一直WA)--又翻了题解发现是循环跳出没有弄对,要dp[i][j]>=n的同时且j==s(因为要刚好打s只怪--)
发现把每只怪的数量当1也能过(自己就是这样想的---55555)
每只怪只有一只水过版本--
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 1005 6 using namespace std; 7 int dp[maxn][maxn],a[maxn],b[maxn]; 8 int main() 9 { 10 int i,j,k,n,m,s,t; 11 while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF&&n&&m&&k&&s) 12 { 13 for(i=1;i<=k;i++) scanf("%d %d",&a[i],&b[i]); 14 memset(dp,0,sizeof(dp)); 15 for(i=1;i<=m;i++) 16 { 17 for(j=1;j<=s;j++) 18 { 19 for(t=1;t<=k;t++) 20 if(i>=b[t]&&j>=1) 21 dp[i][j]=max(dp[i][j],dp[i-b[t]][j-1]+a[t]); 22 } 23 if(dp[i][s]>=n) break; 24 } 25 if(i>m) printf("-1\n"); 26 else 27 printf("%d\n",m-i); 28 } 29 }
标准无数只怪版本--
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 1005 6 using namespace std; 7 int dp[maxn][maxn],a[maxn],b[maxn]; 8 int main() 9 { 10 int i,j,k,n,m,s,t; 11 while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF&&n&&m&&k&&s) 12 { 13 for(i=1;i<=k;i++) scanf("%d %d",&a[i],&b[i]); 14 memset(dp,0,sizeof(dp)); 15 for(i=1;i<=m;i++) 16 { 17 for(j=1;j<=s;j++) 18 { 19 for(t=1;t<=k;t++) 20 { 21 int h=1; 22 while(i>=h*b[t]&&j>=h) 23 { 24 dp[i][j]=max(dp[i][j],dp[i-h*b[t]][j-h]+h*a[t]); 25 h++; 26 } 27 } 28 } 29 if(dp[i][s]>=n) break; 30 } 31 if(i>m) printf("-1\n"); 32 else 33 printf("%d\n",m-i); 34 } 35 }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4291911.html