标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13177 Accepted Submission(s): 6718
#include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<algorithm> using namespace std; #define N 12345 #define M 12 int n; int w[4]={0,150,200,350}; int f[N]; int main() { int T;cin>>T; while(T--) { scanf("%d",&n); for(int i=1;i<=3;i++) for(int j=w[i];j<=n;j++) { f[j]=max(f[j],f[j-w[i]]+w[i]); } cout<<n-f[n]<<endl; } return 0; }
一种非常直接暴力的做法
#include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<algorithm> using namespace std; #define N 12345 #define M 12 int n; int main() { int T;cin>>T; while(T--) { int ma=0; scanf("%d",&n); for(int i=0;i<=n/150;i++) for(int j=0;j<=n/200;j++) for(int k=0;k<=n/350;k++) { int sum=150*i+200*j+350*k; if(sum<=n) ma=max(ma,sum); } cout<<n-ma<<endl; } return 0; }
仔细看题可以发现,无敌药水的价钱正好等于血瓶+魔法药品的价钱,所以无敌药品可以直接忽略了,因此可以把上面的代码稍微优化一下,3重循环变成2重了:
for(int i=0;i<=n/150;i++) for(int j=0;j<=n/200;j++) { int sum=150*i+200*j; if(sum<=n) ma=max(ma,sum); }
仔细看一下两种药品价钱150,200,对于小于150的数直接就是那个数,大于300的都不会超过50,所以大于三百直接%50。在这之间的如果判断%200和%150哪个小,哪个小取哪个。这个复杂度就非常低了,是常数级的。
#include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<algorithm> using namespace std; #define N 12345 #define M 12 int n; int main() { int T;cin>>T; while(T--) { scanf("%d",&n); if(n>=150) { if(n>=300) n=n%50; else if(n%200<n%150) n=n%200; else n=n%150; } cout<<n<<endl; } return 0; }
其实这题用搜索也可以做,bfs
#include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<algorithm> using namespace std; #define N 12345 #define M 12 int n; int vis[N]; int bfs() { memset(vis,0,sizeof(vis)); int temp=n; queue<int>q; q.push(temp); while(!q.empty()) { temp=q.front(); q.pop(); if(!vis[temp-150] && temp-150>=0) { vis[temp-150]=1; q.push(temp-150); } if(!vis[temp-200] && temp-200>=0) { vis[temp-200]=1; q.push(temp-200); } } return temp; } int main() { int T;cin>>T; while(T--) { int ma=0; scanf("%d",&n); cout<<bfs()<<endl; } return 0; }
HDU 1248 寒冰王座 (水题的N种做法!)(含完全背包)
标签:
原文地址:http://www.cnblogs.com/wmxl/p/4747273.html