1068. Find More Coins (30)

来源:互联网 发布:java开发oa系统 编辑:程序博客网 时间:2024/06/04 19:40

IDEA

1.背包问题变形:原0-1背包问题是往背包转物品使其weight一定,总value最大;现在是使得value一定,最小的组合结果

2.采用动态规划:f(n,m) = max{ f(n–1, m), f(n–1, m–value(n)) +value(n) },题中需要的结果是使得f(n,m)==给定的m

3.用flag[][]来标记是否在达到某个阶段最大值的时候,用了某个value


CODE

#include<iostream>#include<cstring> //memest的头文件 #include<algorithm>#include<fstream>using namespace std;#define MAXn 10010#define MAXm 110int value[MAXn];int flag[MAXn][MAXm];int f[MAXn][MAXm];int cmp(int a,int b){return a>b;}//背包问题,动态规划函数int result(int n,int m){for(int i=1;i<n+1;i++){for(int j=1;j<=m;j++){    //f(N, M) = max{ f(N–1, M), f(N–1, M–c(N)) +value(N) },规划函数   if(j<value[i]||f[i-1][j-value[i]]+value[i]<f[i-1][j]){  f[i][j]=f[i-1][j];  }else{      f[i][j]=f[i-1][j-value[i]]+value[i];  flag[i][j]=1;  }}}return f[n][m];}int main(){#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);#endifint n,m;while(cin>>n>>m){for(int i=1;i<=n;i++){cin>>value[i];}sort(value+1,value+n+1,cmp);memset(f,0,sizeof(f));memset(flag,0,sizeof(flag));int res=result(n,m);//cout<<"res="<<res<<endl;if(res==m){int first=1;while(m){while(!flag[n][m]){n--;}if(first){cout<<value[n];first=0;}else{cout<<" "<<value[n];}m-=value[n];n--;}cout<<endl;}else{cout<<"No Solution"<<endl;}}#ifndef ONLINE_JUDGEfclose(stdin);#endifreturn 0;}


0 0
原创粉丝点击