NYOJ456andNYOJ325
生活随笔
收集整理的這篇文章主要介紹了
NYOJ456andNYOJ325
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
郵票分你一半
時(shí)間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:3 描述接下來(lái)有一個(gè)整數(shù)n(n<=1000),表示郵票的張數(shù)。
然后有n個(gè)整數(shù)Vi(Vi<=100),表示第i張郵票的分值。
背包問(wèn)題演變: ?
思路:?
以?xún)r(jià)值的總和的一半為背包容量,構(gòu)建0-1背包,
只要保證一半的背包容量裝的價(jià)值最大就行。
因?yàn)樽畲笠簿褪强們r(jià)值的一半。
#include<iostream>
#include<cstring>
using namespace std;
int a[100010],b[100010];
int main()
{int m,n,sum,i,j;cin>>m;while(m--){memset(a,0,sizeof(a));memset(b,0,sizeof(b));/*第一次寫(xiě)時(shí)漏掉了數(shù)組初始化太大意了對(duì)于多組測(cè)試數(shù)據(jù),每次輸入測(cè)試數(shù)據(jù)都要進(jìn)行初始化*/ sum=0;cin>>n;for(i=1;i<=n;i++){cin>>a[i];sum+=a[i];}for(i=1;i<=n;i++)for(j=sum/2;j>=a[i];j--)b[j]=(b[j]>b[j-a[i]]+a[i]?b[j]:b[j-a[i]]+a[i]); cout<<sum-2*b[sum/2]<<endl;}}
zb的生日
時(shí)間限制:3000?ms ?|? 內(nèi)存限制:65535?KB 難度:2 描述第一行輸入西瓜數(shù)量N (1 ≤ N ≤ 20)
第二行有N個(gè)數(shù),W1, …, Wn (1 ≤ Wi ≤ 10000)分別代表每個(gè)西瓜的重量
深搜:
#include <stdio.h> #include <math.h> int a[21],sum,all,n,i,j,min; void dfs(int star) { if(star==n) return ; if(fabs(all-sum*2)<min)//差值最小。。如果這里不懂 動(dòng)動(dòng)手 原式轉(zhuǎn)換得到的 min=fabs(all-sum*2); for(int j=star;j<n;j++) { sum+=a[j]; dfs(j+1); sum-=a[j]; } } int main() { while(scanf("%d",&n)!=EOF) { all=0; for(i=0;i<n;i++) scanf("%d",&a[i]),all+=a[i]; min=n*10001; dfs(0); printf("%d\n",min); } }DP:
#include<iostream> #include<cstring> using namespace std; int dp[100010],a[25];//dp中下標(biāo)值為當(dāng)前狀態(tài)西瓜總重量 int main() {int n;while(cin>>n){int sum=0;memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i]; }for(int i=1;i<=n;i++)for(int j=sum/2;j>=a[i];j--)dp[j]=(dp[j]>dp[j-a[i]]+a[i]?dp[j]:dp[j-a[i]]+a[i]);//三目運(yùn)算符比max()函數(shù)更省時(shí) cout<<sum-2*dp[sum/2]<<endl;} }用時(shí)很短的代碼詳見(jiàn)博客:http://blog.csdn.net/dgq8211/article/details/7720729
平臺(tái)最優(yōu)
#include <stdio.h> #define max(a,b) a>b?a:b int V,ans,n,w[21],sum[21]; void dfs(int i,int cnt) {if(i == 0){ans = max(ans,cnt);return ;}if(ans == V || cnt+sum[i] <= ans) //cutreturn ;if(cnt+w[i] <= V)dfs(i-1,cnt+w[i]);dfs(i-1,cnt); } int main() {while(~scanf("%d",&n)){ans = 0;for(int i=1;i<=n;i++){scanf("%d",&w[i]);sum[i] = sum[i-1] + w[i];}V = sum[n]/2;dfs(n,0);printf("%d\n",sum[n]-2*ans);}return 0; }總結(jié)
以上是生活随笔為你收集整理的NYOJ456andNYOJ325的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 女生学计算机和遥感哪个好就业,遥感专业女
- 下一篇: 如何高效阅读英文数据手册?